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; //報錯
const
與let
命令相同,只在宣告的塊級作用域有效,且不會被提公升,存在暫時性死區,不可重複宣告
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...