读书人

为什么这个不是闭包解决办法

发布时间: 2012-05-07 12:40:40 作者: rapoo

为什么这个不是闭包

JScript code
function a(){    var array = new Array();    for (var i = 0; i < 10; i++)    {        array.push(function() {return i});    }        return array;}var array = a();for (var i = 0; i < array.length; i++){    window.alert(array[i]()); //全是10}

请问为什么这个不是闭包?我是认为,内部函数引用外部函数的变量,并且内部函数返回给了一个全局变量,符合闭包的条件。但在这个帖中http://topic.csdn.net/u/20111202/10/1a48255e-14ca-4ccc-b814-f36af80696e2.html?84111都认为这个不是闭包。

[解决办法]
内部函数引用外部函数的变量,外部函数的变量i只有一个值
[解决办法]
JScript code
function a(){    var array = new Array();    for (var i = 0; i < 10; i++)    {        array.push(function() {return i}); //这个i并不是内部函数的局部变量,怎么会是闭包呢,function(i) {return i;} 这个内部函数的局部变量i才是闭包    }        return array;}
[解决办法]
纯粹的闭包
只是不是你想象中的闭包
[解决办法]
function() {return i} 这样的语句并没有被执行,只是构建了一个函数体为return i;的函数对象,仅此而已。当i=10时,迭代停止,外部函数返回。当再去调用array[i]()时,i的值依旧为10。因此每一个元素的array都返回i=10。 跟我之前看到的一个例子一样,很相似……

[解决办法]
都是闭包。
函数执行创建作用域,函数声明绑定作用域。
JScript code
<script>function f(x) {      var g = function () { return x; }      return g;  }</script>
[解决办法]
所以你每次执行f,都会重新声明一次g,然后g里面的x因为本身未定义,就会到f域去找。
[解决办法]
而你主贴贴的代码,不是闭包还能是啥呢?
[解决办法]
闭包是一个动态的概念,是在函数运行时存在的,如果当前函数内没有此变量,则从父函数中去直至到顶。所以欲行时取i,此时i为10

读书人网 >JavaScript

热点推荐