塊級繫結 var let const

2021-08-25 02:24:39 字數 1678 閱讀 7448

使用 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的區別...