首先是这两段代码代码1: function createFunctions() { var result = new Array(); for (var i = 0; i < 10; i++) { result[i] = function() { return i; }; } return result;}var funcs = createFunctions();for (var i = 0; i < 10; i++) { alert(funcs[i]());}代码2:for (var i = 0; i < aLi.length; i++) { aLi[i].onmouseover = function() { this.style.background = 'red'; }; aLi[i].onmouseout = function() { this.style.background = '#fff'; }}请问:1.为什么代码1中,在最后i变成10之后才执行函数的内容,而代码2却是按i的自增顺序每次都执行呢?2.这和js的异步执行是否有关系?但我又对这里的执行顺序感到十分混乱,捋不清楚,请大神详细说一下
2 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
代码 1 中,数组 result 中的函数都引用的 createFunctions 中的变量,而 for 循环结束之后,i 的值为 10,所以你打印出来的都是 10。
这实际是 闭包延迟计算 的问题:
result[i] = function() {
return i;
}; // 在执行 这个语句的时候,解释器并没有计算 i 的值,直到你调用 `result[i]` 的时候,这时 i 已经是 10 了
守着一只汪
TA贡献1872条经验 获得超3个赞
result[i] = function() {
return i;
};
}
这段代码中return i中的i变量是自由变量,他的值是创建时时父作用域决定的,当函数执行时父作用域i已经为10了,所以输出10
了解一下自由变量,作用域和执行环境就懂了
添加回答
举报
0/150
提交
取消