下面的例子中,每个函数都返回的是10。因为每个函数的作用域链中都保存着createFunction()函数的活动对象,所以他们引用的都是同一个变量
function createFunction(){ var result = new Array(); for (var i=0 ; i <10 ; i++ ) { result[i] =function(){ return i; } } return result; } var funcs = createFunction(); for (var i=0;i<10 ;i++ ) { alert(funcs[i]()); } function createFunction(){ var result = new Array(); for (var i=0 ; i <10 ; i++ ) { result[i] = function(){} } return result; } var funcs = createFunction(); for (var i=0;i<10 ;i++ ) { alert(funcs[i]()) }
通过创建另一个匿名函数可以使得闭包的行为符合预期,定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数的时候,都传入了变量i。由于函数的参数是按值传递的,所以会将变量i的当前值复制给num。而在这个匿名函数内部,又创建了一个访问num的闭包。这样一来,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回不同的值啦。
function createFunction(){ var result = new Array(); for (var i=0 ; i <10 ; i++ ) { result[i] = function(num){ return function(){ return num; } }(i); } return result; } var funcs = createFunction(); for (var i=0;i<10 ;i++ ) { alert(funcs[i]()) }