在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關(guān)于塊級作用域,閉包的問題

關(guān)于塊級作用域,閉包的問題

首先是這兩段代碼

代碼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之后才執(zhí)行函數(shù)的內(nèi)容,而代碼2卻是按i的自增順序每次都執(zhí)行呢?
2.這和js的異步執(zhí)行是否有關(guān)系?但我又對這里的執(zhí)行順序感到十分混亂,捋不清楚,請大神詳細說一下

回答
編輯回答
互擼娃

代碼 1 中,數(shù)組 result 中的函數(shù)都引用的 createFunctions 中的變量,而 for 循環(huán)結(jié)束之后,i 的值為 10,所以你打印出來的都是 10。

這實際是 閉包延遲計算 的問題:

result[i] = function() {
            return i;
};  // 在執(zhí)行 這個語句的時候,解釋器并沒有計算 i 的值,直到你調(diào)用 `result[i]` 的時候,這時 i 已經(jīng)是 10 了
2017年6月14日 14:15
編輯回答
墨染殤
result[i] = function() {
            return i;
        };
    }

這段代碼中return i中的i變量是自由變量,他的值是創(chuàng)建時父作用域決定的,當函數(shù)執(zhí)行時父作用域i已經(jīng)為10了,所以輸出10

了解一下自由變量,作用域和執(zhí)行環(huán)境就懂了

2018年4月16日 10:12