var 如果使用關鍵字 var 聲明一個變數,那麼這個變數就屬於當前的函數作用域,如果聲明是發生在任何函數外的頂層聲明,那麼這個變數就屬於全局作用域。 let 1、let 聲明的變數具有塊作用域的特征。 2、在同一個塊級作用域,不能重覆聲明變數。 function foo(){ let a = 1; ...
var
如果使用關鍵字 var 聲明一個變數,那麼這個變數就屬於當前的函數作用域,如果聲明是發生在任何函數外的頂層聲明,那麼這個變數就屬於全局作用域。
let
1、let 聲明的變數具有塊作用域的特征。
2、在同一個塊級作用域,不能重覆聲明變數。
function foo(){
let a = 1;
let a = 2;//Uncaught SyntaxError: Identifier 'a' has already been declared
}
3、let 聲明的變數不存在變數提升,換一種說法,就是 let 聲明存在暫時性死區(TDZ)。
for (var i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
},100)
};
會列印4個4 :setTimeout是非同步執行的,100毫秒後向任務隊列里添加一個任務,只有主線上的全部執行完才會執行任務隊列里的任務,所以當主線程for迴圈執行完之後 i 的值為5,這個時候再去任務隊列中執行任務,i全部為5;每次for迴圈的時候setTimeout都會執行,但是裡面的function則不會執行被放入任務隊列,因此放了5次;for迴圈的5次執行完之後不到1000毫秒;1000毫秒後全部執行任務隊列中的函數,所以就是輸出五個5啦
for (let i = 0; i < 5; i++) {
setTimeout(function(){
console.log(i);
},100)
};
會列印0,1,2,3,4:假如把var換成let,那麼輸出結果為0,1,2,3,4;因為let i 的是區塊變數,每個i只能存活到大括弧結束,並不會把後面的for迴圈的 i 值賦給前面的setTimeout中的i;而var i 則是局部變數,這個 i 的生命周期不受for迴圈的大括弧限制;
const
聲明方式,除了具有 let 的上述特點外,其還具備一個特點,即 const 定義的變數,一旦定義後,就不能修改,即 const 聲明的為常量。
const obj = {a:1,b:2};
console.log(obj.a);//1
obj.a = 3;
console.log(obj.a);//3
所以準確的說,是 const 聲明創建一個值的只讀引用。但這並不意味著它所持有的值是不可變的,只是變數標識符不能重新分配。