使用 var 關鍵字宣告的變數,無論其實際宣告位置在何處,都會被視為宣告於所在函式的頂部(如果宣告不在任意函式內,則視為在全域性作用域的頂部)。這就是所謂的變數提公升(hoisting )
塊級宣告也就是讓所宣告的變數在指定塊的作用域外無法被訪問。塊級作用域(又被稱為詞
法作用域)在如下情況被建立:
語法與var一致,但用let宣告的變數會將變數的作用域限制在當前**中。
特點:使用 const 宣告的變數會被認為是常量(constant ),意味著它們的值在被設定完成後就不能再被改變。
const person = ;
// 工作正常
person.name = "greg";
// 丟擲錯誤
person = ;
(1)暫時性死區(temporal dead zone)
let 或 const 宣告的變數為何在宣告處之前無法被訪問。
當 js 引擎檢視接下來的**塊並發現變數宣告時,它會在面對 var 的情況下將宣告提公升到
函式或全域性作用域的頂部,而面對 let 或 const 時會將宣告放在暫時性死區內。任何在暫
時性死區內訪問變數的企圖都會導致「執行時」錯誤(runtime error)。只有執行到變數的宣告
語句時,該變數才會從暫時性死區內被移除並可以安全使用。
使用 let 或 const 宣告的變數,若試圖在定義位置之前使用它,無論如何都不能避免暫時
性死區。
(2)迴圈中使用塊級繫結
在 for 迴圈內,也就是想讓一次性的迴圈計數器僅能在迴圈內部使用。
for (let i = 0; i < 10; i++)
// i 在此處不可訪問,丟擲錯誤
console.log(i);
let 與 const 不同於 var 的另乙個方面是在全域性作用域上的表現。當在全域性作用域上使
用 var 時,它會建立乙個新的全域性變數,並成為全域性物件(在瀏覽器中是 window )的一
個屬性。這意味著使用 var 可能會無意覆蓋乙個已有的全域性屬性,就像這樣:
// 在瀏覽器中
var regexp = "hello!";
console.log(window.regexp); // "hello!"
var ncz = "hi!";
console.log(window.ncz); // "hi!"
儘管全域性的 regexp 是定義在 window 上的,它仍然不能防止被 var 重寫。
然而若你在全域性作用域上使用 let 或 const ,雖然在全域性作用域上會建立新的繫結,但不
會有任何屬性被新增到全域性物件上。這也就意味著你不能使用 let 或 const 來覆蓋乙個全
局變數,你只能將其遮蔽。
// 在瀏覽器中
let regexp = "hello!";
console.log(regexp); // "hello!"
console.log(window.regexp === regexp); // false
const ncz = "hi!";
console.log(ncz); // "hi!"
console.log("ncz" in window); // false
塊級作用域繫結
1 無論在哪宣告,都會被當成在當前作用域頂部宣告的變數 hosting機制 2 var會覆蓋全域性屬性 1 塊級識別符號,不會被提公升,用臨時死區 tdz 表示 2 let不能覆蓋全域性屬性,只能遮蔽 3 let不能重複定義,即定義乙個已被定義過了的乙個變數 4 for in迴圈和for of迴圈 ...
ES6小結1 塊級繫結
變數提公升 hoisting 使用 var 關鍵字宣告的變數,無論其實際宣告位置在何處,都會被視為宣告於所在函式的頂部 如果宣告不在任意函式內,則視為在全域性作用域的頂部 特點 1 同名變數忽略 var foo var foo 忽略 var foo 忽略 忽略 2 同名函式覆蓋 function f...
一 塊級作用域繫結let const var
1 變數提公升機制 無論在哪宣告,都會被當成在當前作用域頂部宣告的變數,這種機制在很多時候會產生問題。2 如果是在全域性作用域中宣告,會被繫結到window屬性中,示例如下 var a 1 console.log a,window.a 輸出1 1 3 同一變數可重複宣告。1 let和const的區別...