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

首先是这两段代码


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


Helenr
浏览 491回答 2
2回答

凤凰求蛊

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

守着一只汪

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

相关分类

JavaScript