这样函数会返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,即位置为0的函数返回0,位置为1的返回1,以此类推。但实际上,每个函数都返回10。因为每个函数的作用域链中都保存着 cFunc()函数的活动对象,所以它们引用的都是同一个变量i,当cFunc() 函数返回后,变量 i 的值为 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以在每个函数内部 i 的值都是 10
function cFunc()
{
var result = new Array();
for(var i=0; i<10; i++)
{
result[i] = function(){
return i;
};
}
return result;
}
var funcs = cFunc();
for(var i=0; i<10; i++)
{
document.write(funcs[i]() + "<br />");
}
//结果为
/*
10
10
10
10
10
10
10
10
10
10
*/
=======================================
/*
for(var i=0; i<10; i++)
{
document.write(funcs[i] + "<br />");
}
结果为:
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
function (){ return i; }
*/
==================
可以通过创建另一个匿名函数强制让闭包的行为符合预期:
function cFunc()
{
var result = new Array();
for(var i=0; i<10; i++)
{
result[i] = function(num){
return function()
{
return num;
}
}(i);
}
return result;
}
var funcs = cFunc();
for(var i=0; i<10; i++)
{
document.write(funcs[i]()+"<br />");
}
// 结果为
/*
0
1
2
3
4
5
6
7
8
9
*/
没有直接把闭包赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数 num, 也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量 i,由于函数参数是按值传递的,所以就会将变量 i 的当前值复制给参数 num.而在这个匿名函数内部,又创建并返回一个访问 num 的闭包。这样一来,result 数组中的每个函数都有自己 num 变量的一个副本,因此就可以返回各自不同的数组了。
=======================
var nn = (function(){
alert("lin3615");
})();
以上会立即调用
=====================
var nn = (function(){
alert("lin3615");
});
nn();
在调用时才算真正调用