猿问

关于块级作用域,闭包的问题

首先是这两段代码
代码1:
functioncreateFunctions(){
varresult=newArray();
for(vari=0;i<10;i++){
result[i]=function(){
returni;
};
}
returnresult;
}
varfuncs=createFunctions();
for(vari=0;i<10;i++){
alert(funcs[i]());
}
代码2:
for(vari=0;iaLi[i].onmouseover=function(){
this.style.background='red';
};
aLi[i].onmouseout=function(){
this.style.background='#fff';
}
}
请问:1.为什么代码1中,在最后i变成10之后才执行函数的内容,而代码2却是按i的自增顺序每次都执行呢?2.这和js的异步执行是否有关系?但我又对这里的执行顺序感到十分混乱,捋不清楚,请大神详细说一下
慕哥9229398
浏览 193回答 2
2回答

杨__羊羊

代码1中,数组result中的函数都引用的createFunctions中的变量,而for循环结束之后,i的值为10,所以你打印出来的都是10。这实际是闭包延迟计算的问题:result[i]=function(){returni;};//在执行这个语句的时候,解释器并没有计算i的值,直到你调用`result[i]`的时候,这时i已经是10了

侃侃无极

result[i]=function(){returni;};}这段代码中returni中的i变量是自由变量,他的值是创建时时父作用域决定的,当函数执行时父作用域i已经为10了,所以输出10了解一下自由变量,作用域和执行环境就懂了
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答