javascript闭包中变量被保存的问题

kog-7 发布于 2014/03/29 16:49
阅读 479
收藏 1
请教大家,如下定义一个abc的函数对象,第一次运行完abc()里面的i变成1,但是运行完成i不是被释放了吗,第二次运行应该i还是从零开始啊,为什么如下的会从上一次的i为1开始呢?
还有,这种定义函数对象的方法为什么要在最后}再加一个(),我看有些他没加,有些他加了。
从javascript启示录里面看不明白的,麻烦高人指点。


代码如下
var abc=function(){var i=0; return(){return ++i;};}();
console.log(abc());   得到1
console.log(abc());    得到2
console.log(abc());    得到3
加载中
1
elson1024
elson1024


//你的代码我没看懂,不过就个人理解应该是写成这样
var abc = function(){
	var i=0; 
	return function(){
	    return ++i;
	};
}(); 
console.log(abc());
console.log(abc());

/*
    闭包有两个特征
        一个是内部可以访问外部的变量,
        另一个就是可以让访问的那个变量始终保持在内存中(这个就是为啥1,2,3...了)
    没加() 那么
    abc 就是 function(){
	var i=0; 
	return function(){
	    return ++i;
	};
    };
    加了()
    第一个function执行返回  function(){return ++i;}
    此时abc 就是 function(){return ++i;}
    当再次加()
    abc()这样子, 第2个function 执行 返回 ++i 也就是1,2,3...
*/




kog-7
kog-7
闭包就是函数中包含函数,那么是否只要是外层函数的变量被内层函数使用了,他就变成全局不释放了呢。 还有朋友你告诉的()的原因没看懂。 这个代码是外国书上的。
冷血
冷血
这个是正解
0
架构梦想
架构梦想

abc => 匿名函数返回的新函数域,[i,[abc函数域]]

abc() => 执行的是abc函数域的东西,对于i来说就是全局变量.

说不太清楚,大概就是这个意思.

abc这个函数对象释放以后i才会跟着释放.

0
kog-7
kog-7

谢谢你,不过,结果我知道,就是要个解释原因啊。也明白这里i充当了全局变量,但是为什么他会在这种模式下参加,我调用的是整个abc,调用完了就应该释放。

0
elson1024
elson1024

看下这个人系列博客

http://www.cnblogs.com/TomXu/archive/2012/01/31/2330252.html

如果实在还要不懂,爱莫能助~


0
pantrick
pantrick

var abc=function(){

    var i=0; 

     return(){

      return ++i;

   };

}(); 



虽然i声明在 function内,但是其实没有作用域,仍然是全局的

0
我是李达康
我是李达康

var abc=function(){var i=0; return(){return ++i;};}(); 
console.log(abc());
console.log(abc());
console.log(abc());
//SyntaxError: Unexpected token )  <---为什么会是这个根本执行不了!

不过可以肯定的是  i  不是全局变量



0
淘淘我的小宝宝
淘淘我的小宝宝
自执行函数加闭包吧,因为i在函数退出后仍然被返回的函数所引用所以不会释放。类似于java gc回收对象的样子。
kog-7
kog-7
回复 @with_you :我就是看的js启示录上的,我没有表示对全局的看法,因为不知道,就咨询。
淘淘我的小宝宝
淘淘我的小宝宝
@kog-7 建议你看看js作用域,可以看看javascript高级编程。变量是不是全局的不是你说的那样,而是声明的方式。
kog-7
kog-7
感觉闭包的形式就是函数中的函数,那么外层函数的变量是1变量,那么是不是只要把1变量写到内层函数的前面,他就是全局的呢?如果朋友你知道原因就跟我说下把,知道结果。
返回顶部
顶部