在let出現(xiàn)之前匣距,一直使用var來聲明變量,那個時候面試常問的一些問題諸如變量提升上荡,for循環(huán)的壞處之類的趴樱。
現(xiàn)在雖然有了更可靠的let,因為還有老的代碼存在酪捡,所以這里也記錄下var所存在的問題叁征。
變量污染的問題
for(var i = 0;i<10;i++){}
console.log(i); // 10
if(true) {
var b = 1;
}
console.log(b); // 1
像上面的代碼,在for逛薇,if捺疼,或者switch等操作中,我們無意間會創(chuàng)建出某些變量永罚,造成變量污染啤呼,這并不是我們理想的樣子。
使用let來優(yōu)化:
for(let i = 0;i<10;i++){}
console.log(i); // a is not defined
if(true) {
let b = 1;
}
console.log(b); // b is not defined
作用域考察問題
以前的一個經(jīng)典的面試題呢袱,我被問到過好幾次:
如何在不修改定時器的情況下打印出0-9官扣?
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
}, 0)
}
// 這里是打印出10個10
想要0-9只需要把var改成let就可以了,var創(chuàng)建的是全局的變量羞福,定時器中拿到的i已經(jīng)是for循環(huán)疊加之后的i了惕蹄,所以得到了10。let則是當前作用域下的變量治专,定時器中拿到的i是每次循環(huán)的i卖陵,所以得到了0-9。
創(chuàng)建一個封閉的作用域區(qū)間
for(var i = 0; i < 10; i++){
(function(a){
setTimeout(function(){
console.log(a); // 得到0-9
}, 0)
})(i);
};
通過自執(zhí)行函數(shù)的封閉區(qū)間來實現(xiàn)類似let的效果张峰,讓i僅在當前作用域下生效泪蔫。