最近一直在看js闭包,对js闭包的概念看了很多,可是一看到代码就懵了,请大神指点一二。
闭包:有权利访问包含函数的内部的所有变量
//方法1
function createFunctions()
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function(){
return i;
};
}
return result;
}
//方法2
function createFunctions()
{
var result=new Array();
for(var i=0;i<10;i++)
{
result[i]=function(num){
function()
{
return num;
};
}(i);
}
return result;
}
提问:方法1和方法2的结果是不一样的,1的值全部都是10,2的值是1,2,3,4.。。10
我想知道2是怎么理解的,result[i]是调用的一个方法,方法里再来一个方法,后面还加了个(i),不太明白
第一个数组存的是方法体吧,本身未执行。要result[0]();这样才能输出结果。
第二个中,function(){}(),这样的写法,是自调用方法,相当于将第二个小括号中的值,作为方法的参数使用,并返回结果。
不过不知道你的代码是不是贴错, function() { return num; };直接放在方法体中,是不合法的吧。
方法2写错了吧 少了个 return
result[i]=function(num){
return function()
{
return num;
};
}(i);
function(num){}(i) 意思是 创建一个方法并马上调用, 传入外部参数i, 方法内部则返回一个新的方法,返回num的值, 此时i传入成为内部参数num, 这样就被闭包保存下来.
将来调用 result[0](); 就会返回0