猿问

在书中看见的JS例子,有点不太明白

讲的是闭包的问题函数的执行环境我明白,闭包感觉有点相似于java中的内部类(不知有错没),书上举了一个下面的例子
functioncreateFunctions(){
varresult=newArray();
for(vari=0;i<10;i++){
result[i]=function(){
returni;
};
}
returnresult;
}
书上说函数会返回一个函数数组但是每个函数都是返回的10,并非自己的索引。这里不太明白...书上把代码改成了
functioncreateFunctions(){
varresult=newArray();
for(vari=0;i<10;i++){
result[i]=function(num){
returnfunction(){
returnnum;
};
}(i);
}
returnresult;
}
说这样就能返回索引了...头晕了(~@.@~)
茅侃侃
浏览 431回答 2
2回答

GCT1015

闭包又见闭包...LZ你运行一下第一个createFunctions(),看看你得到结果是什么?[function(){returni},function(){returni},function(){returni},function(){returni}....]而不是你想象中的[function(){return0},function(){return1},function(){return2},function(){return3},....]醒醒!这是result[i]带给你的错觉!这就是闭包,匿名函数function(){returni};仅仅代表返回i,那i是多少哪?当匿名函数执行的时候,从作用域链中寻找,匿名函数的寻i历险记如下:嗯,我自己的作用域里没定义i,接着往上走,诶!老爹createFunctions的作用域里定义了i,它的值又是多少?这个for循环(十年前就执行完了)里说了i是10!好,返回10。函数运行结束。现在说说第二个createFunctions。首先=function(num){returnfunction(){returnnum;};}(i);这玩意叫立即执行函数表达式,字面意思,运行到这它立刻就执行了!i=0时,它立刻就return了一个function(){returnnum;};同第一个分析的一样,我们看看这个num是多少自己作用域里没num,往上走,诶!老爹(同样没名字)的作用域里有num,作为形参被赋值了0,找到了!跟祖父createFunctions里i现在是多少有关系吗?毫无关联!
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答