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

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

這個變量i,有點不太懂

這個變量i,有點不太懂

喵喵時光機 2018-12-10 17:15:43
for (let i = 0; i < 5; i++) {            a[i] = function() {                console.log(i)            }        }        a[2]() //2i為什么不是undefined,for循環里面我只是創建了一個函數,為什么我執行a[2]的時候還是能拿到i的值
查看完整描述

1 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

因為let具有塊級作用域的特性,因此i只會在當前循環有效。
實際上你的循環創建了5個塊級作用域,每一個i值都只在當前的塊級作用域中有效果。

你的代碼等同于如下:

"use strict";


var _loop = function _loop(i) {

    a[i] = function () {

        console.log(i);

    };

};


for (var i = 0; i < 5; i++) {

    _loop(i);

}


a[2]();

這里就很容易能看出:
實際上let的存在讓每一個i值都保存在了一個閉包中。因此這個循環創建了5個閉包。
而a數組里則保存了一堆函數,每一個函數都訪問了對應的閉包中的i值。

所以i的值肯定是存在的而不undefined。

當你看不懂ES6語法相關的代碼時,可以利用babel的在線工具將ES6的例子轉換成ES5的代碼。 在線地址


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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