重讀《深入理解ES6》 塊級作用域

2021-09-12 01:11:21 字數 2607 閱讀 3532

一、關於變數宣告提公升

在 es5 中,我們通常會使用var來宣告變數。在使用var宣告變數的時候,通常會遇到變數宣告提公升的問題。這種機制會讓很多初學者疑惑不解。其實當我們理解了乙個變數通常包括宣告賦值兩個部分,這個問題也就不難理解了。

// 1

console.log(a); // undefined

var a = 3;

// 2

function foo()

}

事實上,無論在全域性作用域或者函式作用域中,只要通過var關鍵字宣告的變數,不論在**宣告,都會被當成在當前作用域頂部宣告的變數。

// 1

var a;

console.log(a);

a = 3;

// 2

function foo()

}

二、塊級作用域

其實,變數提公升的機制,不太符合我們的編碼習慣,我們常常希望**能夠按照順序執行,這也符合一般人的邏輯習慣。為此 es6 引入了塊級作用域的概念。

塊級作用域其實就是詞法作用域,我們的**寫在哪,就會在**執行,這更符合我們的程式設計習慣。我們常說的塊包括函式內部{}之間的部分

為了實現塊級作用域,es6 採用letconst代替var來宣告變數。用letconst宣告的變數會把變數的作用域限制在當前的**塊中,並且宣告的變數不會被提公升。另外,用let宣告的變數,在同一**塊內,禁止重複宣告。

// 1、變數不會提公升

console.log(a); // referenceerror: a is not defined

let a = 3;

// 2、變數只能在當前作用域訪問

if (true)

console.log(b); // referenceerror: b is not defined

// 3、禁止重複宣告

function foo()

foo();

三、let 與 const 的區別

letconst都可以建立乙個塊級作用域,唯一的區別是const用來宣告乙個常量,它的值一旦被設定後不可修改。所以,用const宣告的常量必須初始化。

// 1、不可更改

const a = 1;

a = 2; // typeerror: assignment to constant variable.

// 2、必須初始化

const b; // syntaxerror: missing initializer in const declaration

關於const宣告的變數不可修改,有乙個值得注意的地方就是用const宣告乙個物件。比如:

const tom = ;

tom.age = 19; // 這是可以的

我們可以理解為,用const宣告了乙個變數 tom,將乙個物件的引用位址賦值給變數 tom,只要這個引用位址不發生變化,內部的值是可以修改的。

四、迴圈中塊級作用域

在 es5 中,比較讓人頭疼的地方可能就是 for 迴圈了。在迴圈中,我們用var宣告乙個變數,迴圈結束後,我們其實是希望這個變數被銷毀的。但由於var宣告的變數具有宣告提公升的特性,所以當我們用 for 迴圈的時候,往往會汙染我們的全域性作用域。

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

console.log(i); // 10

// 當迴圈結束的時候,其實我們是希望變數 i 可以被銷毀的。

// 但其實它被留在了全域性

這個時候,我們使用let來宣告迴圈中的變數,就可以輕易的解決這個問題。

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

console.log(i); // referenceerror: i is not defined

// 可以看到,迴圈結束,變數 i 就被銷毀了。 perfect~~

最後總結一下,letconst幫助我們解決了不少問題,我們不會再為變數提公升引發的種種問題而困惑了,同時在迴圈中使用let來代替var可以在迴圈結束的時候銷毀變數,避免無用的變數影響全域性。而當前使用塊級繫結的最佳實踐是:預設使用const,只在確定需要改變變數的值時,使用let,以最大化地避免錯誤的產生。

es6 塊級作用域用法

iife 寫法 function 塊級作用域寫法 塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函式表示式 iife 不再必要了。function f function f 上面 在 es5 jscript不支援塊級作用域環境中執行,會得到 i am inside 因為在 if內宣告的函式f會被...

ES6的塊級作用域

為什麼要使用塊級作用域?1.在預編譯階段,變數的宣告會被提公升到作用域頂部,而初始化操作依舊留在原處執行,在該作用域中未定義變數的地方也能訪問到該變數,但是此時變數尚未初始化,所以其值為undefined,為此es6引入塊級作用域來強化對變數生命週期的控制 塊級宣告 1.塊級作用域用於宣告在指定塊的...

ES6的塊級作用域

let為j ascript新增了塊級作用域,外層作用域無法獲取到內層作用域,這樣非常安全。即使外層和內層都使用相同變數名,也都互不干擾。例如 1 function test 7 console.log a 輸出 18 910 test 呼叫函式 塊級作用域,允許函式可以在塊級作用域中宣告。在塊級作用...