亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于塊級作用域,閉包的問題

關于塊級作用域,閉包的問題

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條經驗 獲得超4個贊

result[i] = function() {

            return i;

        };

    }

這段代碼中return i中的i變量是自由變量,他的值是創建時時父作用域決定的,當函數執行時父作用域i已經為10了,所以輸出10


了解一下自由變量,作用域和執行環境就懂了


查看完整回答
反對 回復 2019-03-30
  • 2 回答
  • 0 關注
  • 508 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號