ES6學習筆記1 let 和 const

2021-08-20 22:46:43 字數 2444 閱讀 1872

let命令與var用法類似,用於宣告變數,區別在於其宣告的變數只在let命令所在的**塊中有效

for (let i=0; i<10; i++)

console.log(i); //變數i未定義

在for迴圈中,設定迴圈變數的那部分是乙個父作用域,而迴圈體內部是乙個單獨的子作用域,上述i在迴圈的作用域中定義,因此在迴圈體外,let宣告的i不再有效。

var命令存在「變數提公升」,即函式宣告和變數宣告總是會被直譯器悄悄地被」提公升」到方法體的最頂部,因此可以在變數宣告之前使用,let命令不允許出現這種狀況,其宣告的變數一定要在宣告後使用,否則會報錯。在let命令宣告變數之前這段時間,變數不可被訪問,稱為暫時性死區

console.

log(foo); //變數i未定義

var foo =

2;console.

log(bar); //報錯

let bar =

2;

var tmp = 123;

if (true)

不允許在同乙個作用域內重複宣告變數

function

()

es6允許塊級作用域的任意巢狀,外層作用域無法讀取內層作用域的變數,而內層作用域可以定義外層作用域的同名變數

console.log(a); //報錯

}

}

為了減輕不相容問題,在es6瀏覽器中,塊級作用域中的函式宣告語句的行為類似於var宣告變數,會被提公升到全域性作用域或函式作用域的頭部,同時還會提公升到所在塊級作用域的頭部。而在其他環境中,函式宣告類似於let語句。

// 瀏覽器的 es6 環境

function

f()

(function

() }

f();

}());

// uncaught typeerror: f is not a function

在es6瀏覽器中,上述**會報錯,是因為函式f()未定義

因此,由於環境導致的行為差異太大,應該避免在塊級作用域中宣告函式,即使需要,也應該寫成函式表示式的形式

;

}

es6塊級作用域宣告函式必須使用大括號,否則會報錯

if (true)
const宣告乙個唯讀常量,一旦宣告,就必須初始化賦值,且不能再重新賦值

const pi = 3.14;

pi

pi = 3; //報錯

const a; //報錯

constlet命令相同,只在宣告的塊級作用域有效,且不會被提公升,存在暫時性死區,不可重複宣告

a //報錯

const實際上保證的是變數指向的那個記憶體位址不得改動,對於簡單型別的資料,值就儲存在記憶體位址中,而對於物件來說,變數指向的記憶體位址儲存的只是乙個指標,因此只是保證這個指標是固定的,而物件本身可以被修改

const a = ;

a.push('hello'); //可執行

a.length = 0; //可執行

a = ['1']; //報錯

如果真想使物件凍結,可以使用object.freeze方法,使其變為不可篡改物件,具體可參考

var命令和function命令宣告的全域性變數是頂層物件的屬性,let命令、const命令、class命令宣告的全域性變數不屬於頂層物件的屬性

var a = 1;

window.a //1

let b = 2;

window.b //未定義

ES6學習筆記1 let命令

1 新增let命令 a referenceerror a is not defined.b 1有一種情況很適合用let命令 for迴圈的計數器。for let i 0 i下面就用乙個例子來比較一下let和var在for迴圈計數器的不同,為什麼let更適合 var a for var i 0 i 8 ...

es6學習筆記 let和const

console.log b uncaught referenceerror a is not defined 在for迴圈中,迴圈語句部分是乙個作用域,內部又是乙個作用域 for let a 1 a 3 a 在let宣告變數完成前,對變數賦值會出錯es中模仿塊級作用域 function functi...

ES6學習筆記 let和const

今天開始讀阮一峰的 ecmascript 6 入門 在這裡記錄下閱讀過程中的要點,以便隨時查閱。頂層物件的屬性與全域性變數掛鉤,被認為是js最大的敗筆之一,es6開始,全域性變數將逐步與頂層物件脫鉤。為了保持相容性,一方面,var和function宣告的全域性變數,依舊是頂層物件的屬性 另一方面,l...