var 是es5的變量聲明
var變量 i 在循環的每次疊代中都被共享
由于存在變量提升 共享變量
導緻外部引用 就是循環以後的結果
修正這個問題,開發者在循環内使用立即調用函數表達式(IIFEs),以便在每次疊代中 強制建立變量的一個新副本
(function(){})()
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs.push(
function() { console.log(i)}
);
}
funcs.forEach(
function(func) {
func(); // 輸出數值 "10" 十次
}
);
let與const是為了解決沒有塊級作用域的問題
var聲明的變量會沿着作用域鍊從裡到外的擷取
function a(){
var b=1;
(function(){
console.log(b);//1
for (var i=0;i<3;i++) {
}
})();
//for (var i=0;i<3;i++) {
//}
console.log(i) // i is not defined
}
a();
從上面可以看出以前我們使用匿名函數來模仿塊級作用域
讓if或者for之類的運作環境不處于全局變量
b等于1就可以知道 var聲明變量,作用域鍊就會從内到外擷取變量
var存在變量聲明 可以先使用再聲明 會說undefined 在嚴格模式報錯
let與const隻在塊級作用域有效 不會沿着作用域 可以嵌套重複變量名使用
必須要先聲明再使用 不然會報錯 出現暫時性死區
因為在進入塊級作用域起 變量就需要先聲明才能使用
{
let a=1
{
let a=2
}
}
由于var與函數聲明一樣存在提升 都會放在最前面 是以一般不會報錯
const 變量 在聲明基本資料類型的時候 string number null undefined
boolean會存儲在記憶體裡面
而聲明object 對象或者數組 複雜的引用資料類型 會存儲在堆裡面 用一個指針調用變量
不可改變的是指針的位址 而不是資料
const f={
}
f={}// invalid assignment to const 'f' 對f的無效指派
var f={}
f={}//不會報錯