天天看點

JavaScript的var let const

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={}//不會報錯      

繼續閱讀