for var let閉包理解


let、 var、 setTimeout,一點思考。

for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100); }

 

結果是很顯而易見的,10次都是10,在面試前端的閉包知識時候很常見。 
用上let之后,

for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100); }

 

結果是: 
0、1、2、3、4、5、6、7、8、9

為什么var和let聲明的i,得到不同的結果?

var聲明的i,作用域不僅僅在for循環內,還在for循環的外部。

當setTimeout執行的時候,for循環已經完成,i此時的值是10,我們稍微調整一下代碼:

for(var i = 0; i < 10; i++){ setTimeout(function(){ consoleLog(); },100); } function consoleLog(){ console.log(i); }

結果是10次10。

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

 

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

 

等價。

但是在let聲明的時候則不一樣,

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

 

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

是不等價的,因為let聲明只在代碼塊中有效。 
但是,如果僅僅這樣,我們或許很容易理解

for(var i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100); }

 

得到10次10,然而為什么

for(let i = 0; i < 10; i++){ setTimeout(function(){ console.log(i); },100); }

 

得到0-9?

在setTimeout的時候,匿名函數function(){console.log(i);}會被聲明創建,當匿名函數執行的時候,會查找當前運行環境的 i 的值。 
var聲明的 i ,運行環境的 i 的值為10,但是let聲明的 i,運行環境中 i 的值是每一個循環創建匿名函數時候的 i。 
所以得到了0-9的值。

let替換var,可以很好的解決閉包的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM