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

首先是这两段代码

代码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的异步执行是否有关系?但我又对这里的执行顺序感到十分混乱,捋不清楚,请大神详细说一下

阅读 1.4k
2 个回答

代码 1 中,数组 result 中的函数都引用的 createFunctions 中的变量,而 for 循环结束之后,i 的值为 10,所以你打印出来的都是 10。

这实际是 闭包延迟计算 的问题:

result[i] = function() {
            return i;
};  // 在执行 这个语句的时候,解释器并没有计算 i 的值,直到你调用 `result[i]` 的时候,这时 i 已经是 10 了
result[i] = function() {
            return i;
        };
    }

这段代码中return i中的i变量是自由变量,他的值是创建时父作用域决定的,当函数执行时父作用域i已经为10了,所以输出10

了解一下自由变量,作用域和执行环境就懂了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题