javascript闭包中变量被保存的问题 javascript闭包function 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大括号后的小括号表明函数立即运行 此时abc=function(){return ++i}i在父函数中定义 ++i中的i是父函数的i的引用 所以不会被释放 且累加 楼主给的代码是不是有问题?在第一个return后面应该有个“function”关键字,不然运行不了。支持1L观点:函数体后面跟()表示立即执行。我的理解是:匿名函数被定义的时候,将外部函数的对象添加到自己的作用域链中,因此可以访问外部函数中定义的变量(即i),而外部函数返回后,外部函数的作用域链被销毁,但是外部函数的变量对象(i)仍然存在于匿名函数的作用域中。因此变量i并不会被销毁,反而一直存在于匿名函数的作用域中,除非匿名函数也被销毁。如果要出现楼主的预期现象的话,应该:var abc=function(){var i=0; return function(num){return function(){return ++num;}();}(i);}()这里等于加了一层闭包,最里面的函数保留的只是i的拷贝,而不是i对象的引用。这样,传递参数的时候,都是传递外部函数的i对象。而在执行++num的时候,他们解析的都是自己作用域内的num对象,而不是外部函数的i对象,因此不会出现自增长。后记:为了回答这个问题,看了好多关于闭包的知识!严重地涨姿势了! 1楼回答简洁,准确~后面的“()”是立即执行函数。内部函数访问了外部函数的变量形成闭包,也就是说外部函数执行完毕后 变量i不会被释放而被内部函数一直引用着。内部函数执行时访问的i永远是外部函数中i的最新值,而内部函数对i的每次操作也会对外部函数的i产生影响。 少年,你已经接触了js最扯蛋的地方:闭包。2楼说的没错,缺少一个function。然后回答你的问题:1. 你认为运行完之后释放了,恰恰相反运行完之后,由于ruturn function(){ ++i; }里边引用了i,所以不会被释放。释放的前提是,这个变量没有被引用,被垃圾回收器释放。为什么加了个function(){}之后就没被释放,这就要从js的作用域讲起,js的作用域是按function(){}划分,就是以function(){}为一些变量,参数可访问的有限区域。2. ()的作用,2楼讲立即执行也没错,不过通俗的理解来说是调用。你定义了一段代码片段,不去调用就没有(),想调用就有();是不是上面的听的有点晕,建议你去看看javascript高级程序设计,第三版,那书才是入门的,启示录,你目前消化起来可能要补的功课比较多,对学习的积极性也有打击。循序渐进,还是慢慢来,不浮躁,不急躁,不松懈,不气馁。我的一些经验分享一下:http://www.cnblogs.com/jikey/p/3613082.html js问题,跨域请求json GridView中文本框怎样修改只读形式 关于\这个符号。在两个页面之间传递出现\\请各位帮帮看~ js中如何使用Split。 javascript调用firebreath写的插件,如何调试插件? 用了很多方法都无法解密这个encode加密过的脚本..向大家请教! 下拉式菜单传值问题..... 求助:javascript 模拟按键的问题 net_lover帮我!meizz帮帮我!(想在iframe里显示纯文本) 麻烦各位了! 跪求___仿苹果官网__某特效___代码或插件 easyui datagrid 更改单元格值后getChanges无法获取
i在父函数中定义 ++i中的i是父函数的i的引用 所以不会被释放 且累加
支持1L观点:函数体后面跟()表示立即执行。
我的理解是:匿名函数被定义的时候,将外部函数的对象添加到自己的作用域链中,因此可以访问外部函数中定义的变量(即i),而外部函数返回后,外部函数的作用域链被销毁,但是外部函数的变量对象(i)仍然存在于匿名函数的作用域中。因此变量i并不会被销毁,反而一直存在于匿名函数的作用域中,除非匿名函数也被销毁。
如果要出现楼主的预期现象的话,应该:var abc=function(){
var i=0;
return function(num){
return function(){
return ++num;
}();
}(i);
}()
这里等于加了一层闭包,最里面的函数保留的只是i的拷贝,而不是i对象的引用。这样,传递参数的时候,都是传递外部函数的i对象。而在执行++num的时候,他们解析的都是自己作用域内的num对象,而不是外部函数的i对象,因此不会出现自增长。
后记:为了回答这个问题,看了好多关于闭包的知识!严重地涨姿势了!
内部函数访问了外部函数的变量形成闭包,也就是说外部函数执行完毕后 变量i不会被释放而被内部函数一直引用着。
内部函数执行时访问的i永远是外部函数中i的最新值,而内部函数对i的每次操作也会对外部函数的i产生影响。
2楼说的没错,缺少一个function。
然后回答你的问题:
1. 你认为运行完之后释放了,恰恰相反运行完之后,由于ruturn function(){ ++i; }里边引用了i,所以不会被释放。释放的前提是,这个变量没有被引用,被垃圾回收器释放。
为什么加了个function(){}之后就没被释放,这就要从js的作用域讲起,js的作用域是按function(){}划分,就是以function(){}为一些变量,参数可访问的有限区域。
2. ()的作用,2楼讲立即执行也没错,不过通俗的理解来说是调用。你定义了一段代码片段,不去调用就没有(),想调用就有();是不是上面的听的有点晕,建议你去看看javascript高级程序设计,第三版,那书才是入门的,启示录,你目前消化起来可能要补的功课比较多,对学习的积极性也有打击。循序渐进,还是慢慢来,不浮躁,不急躁,不松懈,不气馁。我的一些经验分享一下:
http://www.cnblogs.com/jikey/p/3613082.html