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

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

var和let的區別,為什么這兩個函數執行的結果不一樣呢

var和let的區別,為什么這兩個函數執行的結果不一樣呢

滄海一幻覺 2019-02-27 21:52:29
var arr = [];for(**var** i = 0; i < 10; i++){        arr[i] = function(){        return i;    };}for(var j = 0; j < arr.length; j++){    console.log(arr[j]() + " ");     } //10個10var和let的區別在哪呢,為什么聲明不一樣就會變成不一樣的結果呢?還有第一個函數為什么i最后都等于10了?i這里是局部變量還是全局變量呢?局部變量不應該for循環完就自動被GC了嗎 還是說第一個函數存在閉包所以保留了對i的引用,所以i不會被GC了var arr = [];for(**let** i = 0; i < 10; i++){    arr[i] = function(){        console.log(i);    };}for(var j = 0; j < arr.length; j++){    console.log(arr[j]());}//0-9
查看完整描述

2 回答

?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

var 存在變量提升,所以你寫的


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

        arr[i] = function(){

        return i;

    };

}

等同于


var i

for(i = 0; i < 10; i++){

        arr[i] = function(){

        return i;

    };

}

實際上就是定義了一個全局變量。


雖然你return的是i,但是你在調用arr[i]這個函數的時候,會沿著作用域鏈找到arr[i]這個函數的上一層作用域,在這里即是全局作用域。所以你調用的時候var已經是10了,可以在 for循環后面添加一個console.log(i)驗證。


let 會創建一個作用域。則,這里就會形成一個閉包

所以,使用let定義時,則分成了三層 Global --> Closure --> Local 作用域

所以你在調用arr[i]這個函數時,其實會根據作用域鏈找到Closure(閉包)中的 變量 i 。

使用下面這行代碼,打開瀏覽器中的Source面板并查看右側的Scope(作用域鏈)驗證。



        var arr = []

        for(let i = 0 ;i<10 ;i++){

            arr[i] = function(){

                debugger

                console.log(i);

            };



        }



        for(var j = 0; j < arr.length; j++){

            console.log(arr[j]());

        }//0-9

ps:個人理解,如有錯誤,希望指出


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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