es6中新增了 let 命令,用於宣告變數,關於let有以下幾個特點:
1 用法類似於var,但是所宣告的變數只在 let 命令所在的**塊內有效,實現了塊級作用域且不會汙染全域性變數。
2 不存在變數提公升
3 暫時性死區
4 同乙個變數在相同作用域內不允許重複宣告
下面圍繞這四個特點進行詳細的分析
let 的基本用法
let宣告的變數與var不用的是,let宣告的變數只在相應的**塊內有效。看下面例子:
console.
log(a)
;//referenceerror: a is not defined
console.
log(b)
;//5
然後再看一下let的應用場景與var的不同之處:
var nums =
;for
(var i=
0; i <
10; i++)}
nums[3]
()//10
for(
let i=
0; i <
10; i++)}
nums[3]
()//3
上面例子中,第乙個輸出是10,第二個輸出是3,那麼為什麼是這樣呢?因為第乙個for迴圈變數i是用var定義的,var定義的在全域性範圍有效,所以全域性只有乙個i,每次迴圈i的值都會改變,所以在被賦值給陣列內部函式的i指向全域性,就是說所有陣列中的i都是指向全域性的同乙個i,即最後一次迴圈的結果10
而第二次,用let宣告的變數i,每次迴圈i都是乙個新的變數,所以最後輸出就是對應的i的值。
不存在變數提公升
既然說let不存在變數提公升,那麼什麼是變數提公升呢?變數提公升可以理解為變數還沒有宣告就已經使用了,即變數在宣告之前使用。
我們都知道var命令會發生變數提公升,而let命令不會發生變數提公升,就是在使用乙個變數之前必須先對該變數進行宣告,不然不會報錯,而var命令的話,如果變數在宣告之前使用的話不會報錯,會顯示undefined。看下面例子:
console.
log(a)
;var a =
'你好'
;//undefined
console.
log(b)
;let b =
'你好'
;// referenceerror
暫時性死區
那麼什麼是暫時性死區呢?在**塊內,只要有let和const命令,則這個塊內用這些命令宣告的的變數就繫結在這個塊級作用域中,不受外部的影響,在**塊內使用let宣告之前變數都是不可用的,這就是暫時性死區。
看下面例子:
var s =
'nihao';if
(true
)
上面例子中,看到第三行報錯了,就是因為在if**塊內變數s還沒有用let宣告就已經使用了,會報錯,此時變數s屬於暫時性死區。
不允許重複宣告
let不允許在相同作用域內重複宣告同乙個變數。否則就會報錯。
看下面幾個例子都會報錯。
function
tist()
//syntaxerror: identifier 'a' has already been declared
function
tist()
//syntaxerror: identifier 'a' has already been declared
function
tist
(msg)
//syntaxerror: identifier 'msg' has already been declared
const 宣告乙個唯讀的常量。一旦宣告,常量的值就不能改變。而且使用const宣告乙個常量的使用,必須在宣告時就初始化,就是在用const宣告時就要給予賦值,否則就會報錯。看下面例子:
const s =1;
s =2;
//typeerror: assignment to constant variable
const a;
//syntaxerror: missing initializer in const declaration
a =5;
const 的作用域與 let 命令相同:只在宣告所在的塊級作用域內有效
const 命令宣告的常量也不會提公升,同樣存在暫時性死區,只能在宣告後使用。
**例子可參看上面let命令時的例子。
const命令的注意事項
在阮一峰的es6標準入門中這樣說到:const 實際上保證的並不是變數的值不得改動,而是變數指向的那個記憶體位址不得改動。對於簡單型別的資料(數值、字串、布林值〉而言,值就儲存在變數指向的記憶體位址中,因此等同於常量。但對於復合型別的資料(主要是物件和陣列)而言,變數指向的記憶體位址儲存的只是乙個指標, const 只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,這完全不能控制 因此,將乙個物件宣告為常量時必須非常小心。
const s =
; s.a =1;
console.
log(s)
// s =
//typeerror: assignment to constant variable
const s =
; s.
push(1
);s.
push(2
);console.
log(s)
;//[1, 2]
s =[3
];//typeerror: assignment to constant variable
因此我們使用const宣告簡單的資料型別時(數值、字串、布林值〉值就是儲存在變數指向的記憶體位址,但是用const宣告複雜的資料型別時,比如物件和陣列,變數指向的記憶體位址儲存的只是乙個指標,我們只要保證這個指標不被改動就行了。
物件凍結(object.freeze())新增新屬性不起作用,嚴格模式時還會報錯。
徹底凍結物件的函式:
var
constantize
=(obj)
=>})
;};
ES6學習 let和const命令
1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...
ES6 一 let和const命令
在js中是沒有塊級作用域的,var 宣告的變數作用域是整個函式體,而let可以起到這一作用 console.log b 2 console.log a a is not defind 而let可以起到這一作用啊在js中變數和函式的宣告會提公升到當前作用域最頂部執行。這樣就會出現問題。var a 函式...
ES6學習 let和const命令
說明 本文參考阮一峰的ecmascript 6 入門 console.log a 塊外使用會報錯 referenceerror a is not defined for迴圈內使用let和var產生的不同效果 下面 使用的是var,結果為10 var a for var i 0 i 10 i a 9 ...