es6 塊級作用域用法

2021-08-14 12:27:52 字數 1661 閱讀 3226

// iife 寫法

(function () ());

// 塊級作用域寫法

塊級作用域的出現,實際上使得獲得廣泛應用的立即執行函式表示式(iife)不再必要了。

function f() 

(function ()

} f();

}());

上面**在 es5、jscript不支援塊級作用域環境中執行,會得到「i am inside!」,因為在

if內宣告的函式f會被提公升到函式頭部,實際執行的**如下:

// es5/jscript環境,不支援塊級作用域的環境

function f()

(function ()

if (false)

f();

}());

es6 就完全不一樣了,理論上會得到「i am outside!」(

使用'use strict'強制使用es6規範,上面的**就沒問題,不然就會像下面遇到的問題。)

因為塊級作用域內宣告的函式類似於let,對作用域之外沒有影響。但是,如果你真的在 es6 瀏覽器中執行一下上面的**,是會報錯的,這是為什麼呢?

原來,如果改變了塊級作用域內宣告的函式的處理規則,顯然會對老**產生很大影響。為了減輕因此產生的不相容問題,es6 在附錄 b裡面規定,瀏覽器的實現可以不遵守上面的規定,有自己的行為方式。

注意,上面三條規則只對 es6 的瀏覽器實現有效,其他環境的實現不用遵守,還是將塊級作用域的函式宣告當作let處理。

根據這三條規則,在瀏覽器的 es6 環境中,塊級作用域內宣告的函式,行為類似於var宣告的變數。

// 瀏覽器的 es6 環境

function f()

(function ()

} f();

}());

// uncaught typeerror: f is not a function (使用嚴格模式就沒問題了 use strict)

上面的**在符合 es6 的瀏覽器中,都會報錯,因為實際執行的是下面的**。

// 瀏覽器的 es6 環境

function f()

(function ()

} f();

}());

// uncaught typeerror: f is not a function

考慮到環境導致的行為差異太大,應該避免在塊級作用域內宣告函式。如果確實需要,也應該寫成函式表示式,而不是函式宣告語句。

// 函式宣告語句

}// 函式表示式

;}

另外,還有乙個需要注意的地方。es6 的塊級作用域允許宣告函式的規則,只在使用大括號的情況下成立,如果沒有使用大括號,就會報錯。

// 不報錯

'use strict';

if (true)

}// 報錯

'use strict';

if (true)

function f() {}

以上**於

ES6的塊級作用域

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

ES6的塊級作用域

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

es6學習 塊級作用域let const

先安裝node 新建1.js檔案,通過node的 cmd進入本地檔案1.js 執行 node 1.js 可以測試以下 1.基本用法 let 宣告變數,只在塊級作用域有效。console.log a a is not defined console.log b 2 在for 迴圈中使用,迴圈和迴圈內部...