let、var、const的區別

先看let和var:瀏覽器

1. 函數

console.log(a); // undefined
var a = 3;
console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 3;
 
在當前代碼執行以前,首先會把全部帶var關鍵字的進行聲明(帶function關鍵字的也會提早聲明而且定義),即所謂的變量提高,let則不存在這種狀況。
ps:項目中建立函數,通常都是基於函數表達式來實現,這樣防止其提早變量提高,如:
 
let fn = function () {};

 

2.spa

var x = 3;
console.log(window.x); // 3

let y = 3;
console.log(window.y); // undefined
 
用var進行全局變量聲明的時候,也會給全局對象(瀏覽器中即window)增長一個對應的屬性;可是用let聲明的變量不存在這個特色。
僅限於全局變量建立時有這個特色,屬於私有的執行上下文中建立的私有變量沒有這個特色。
 
function fn() {
    var x = 1;
    y = 2;
    console.log(fn.x); // undefined
    console.log(fn.y); // undefined
}
fn();
console.log(window.x); // undefined
console.log(window.y); // 2

 

3.指針

var y = 21;
var y = 24;
console.log(y); // 24
console.log('OK'); // Uncaught SyntaxError: Identifier 'x' has already been declared
let x = 21;
console.log(x);
let x = 24;
console.log(x);
 
能夠看到,用var聲明同一個變量屢次,前邊聲明的會被覆蓋以最後一次賦值爲準,而用let聲明同一個變量屢次時,並非在let聲明同一變量第二次時報錯,瀏覽器顯示在代碼第一行就有報錯。
由於一段代碼在瀏覽器執行時,大致須要通過編譯階段和代碼解析階段,用var的能夠重複聲明,是由於在編譯階段中的詞法解析階段能夠審覈過,執行階段遇到已經聲明過的,不會再從新聲明;可是用let的不能夠,是由於在詞法解析階段都過不去,因此也就不存在引擎去執行代碼的階段了。

 

4.code

if (1 === 1) {
    let x = 3;
    console.log(x);
}
console.log(x); // Uncaught ReferenceError: x is not defined
let a = 1;
switch (a) {
    case 1:
        let x = 2;
        break;
}
console.log(x); // Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(x);// Uncaught ReferenceError: x is not defined
try {
    let x = 100;
    console.log(x); // 100
    console.log(a);
} catch (e) {
    let y = 200;
    console.log(y); // 200
}
console.log(y); // Uncaught ReferenceError: y is not defined

 

從上能夠看出,let存在塊級做用域,var則沒有。對象

 

 

再看let(var)和constblog

let x = 10;
x = 20;
console.log(x); // 20
const y = 10;
y = 20; // Uncaught TypeError: Assignment to constant variable.
console.log(y);
const obj = {a: 10};
obj.b = 20;
console.log(obj);  // {a: 10, b: 20}

 

let建立的變量是能夠更改指針指向的,也就是能夠從新賦值的,可是const聲明的變量是不容許改變指針指向的。
ps:以前有人說const建立的是常量,常量即不可更改,但從代碼示例能夠看出,const聲明的基本類型值確實不容許改變,但若聲明的是存儲對象的地址指針,仍是能夠操做該對象的,像數字100這種纔是真正的常量。
相關文章
相關標籤/搜索