ECMAScript中var、let、const的區別
阿新 • • 發佈:2018-11-09
1.let和var的區別
(1)var會存在變數提升的現象,let所宣告的變數一定要在聲明後使用,否則報錯。
(2)let宣告的變數只在它所在的程式碼塊有效。var可以在程式碼塊外進行呼叫。
程式碼如下:
{
var c = 1;
let g = 2;
console.log(g);//返回2
}
console.log(c);//返回1
console.log(b);//報錯
var b = 1;
let a = 3;
console.log(a);//返回3
//塊級作用域 var dates = new Date(); function f() { console.log(dates); if(false) { var dates = "hello"; } } console.log(f()); //報錯 function f1() { let n = 5; if(true) { let n = 10; } console.log(n); // 5 }
(3)for迴圈存在父子作用域
for迴圈計數器:
程式碼中,變數i是let宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是一個新的變數,所以最後輸出的是6。你可能會問,如果每一輪迴圈的變數i都是重新宣告的,那它怎麼知道上一輪迴圈的值,
從而計算出本輪迴圈的值?這是因為 JavaScript 引擎內部會記住上一輪迴圈的值,初始化本輪的變數i時,就在上一輪迴圈的基礎上進行計算。
另外,for迴圈還有一個特別之處,就是設定迴圈變數的那部分是一個父作用域,而迴圈體內部是一個單獨的子作用域。
var arr = []; for(let i = 0; i < 10; i++) { arr[i] = function() { console.log(i)//返回6 } } arr[6]();
程式碼中,變數i是var命令宣告的,在全域性範圍內都有效,所以全域性只有一個變數i。每一次迴圈,變數i的值都會發生改變,而迴圈內被賦給陣列a的函式內部的console.log(i),裡面的i指向的就是全域性的i。也就是說,所有陣列a的成員裡面的i,指向的都是同一個i,導致執行時輸出的是最後一輪的i的值,也就是 10。如果使用let,宣告的變數僅在塊級作用域內有效,最後輸出的是 6。
var ar = []; for(var i = 0; i < 10; i++) { ar[i] = function() { console.log(i);//輸出10 } } ar[1]();
2.const用來定義常量,使用時必須初始化(即必須賦值),只能在塊作用域裡訪問,而且不能修改。