为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Helenr 2019-03-27 22:19:23
首先是这两段代码代码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 了


查看完整回答
反对 回复 2019-03-30
?
守着一只汪

TA贡献1872条经验 获得超3个赞

result[i] = function() {

            return i;

        };

    }

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


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


查看完整回答
反对 回复 2019-03-30
  • 2 回答
  • 0 关注
  • 490 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信