js中的塊級作用域

2022-03-04 12:07:47 字數 1389 閱讀 6183

函式是js中最常見的作用域單元, 宣告在乙個函式內部的變數或函式會在所處的作用域中隱藏起來, 這是有意為之的非常好的設計原則.

但是隨著js的發展, 我們有了某個**塊(通常指內部)隱藏變數或函式的需求, 這就是塊級作用域的由來.

下面是不用es6實現塊級作用域的三種方法, 供以後開發時參考, 相信對其他人也有用.

iife, 即立即執行函式, 用乙個函式作用域(閉包)來模擬塊級作用域.示例如下:

//es6中的塊級作用域

console.log(a); //referenceerror

//iife實現

(function() )();

console.log(a); //undefined

可以看到, 由於變數提公升, a不再是未初始化, 而是未定義. 這是使用iife不好的一方面, 但還可以接受. 另一方面由於閉包擁有很多不好的特性, 比如this指向改變啊, return,break和continue發生變化啊, 記憶體洩漏問題啊等等, 所以iife並不是乙個普適的方案.

es3開始, js中就已經定義了一種塊級作用域, 它就是throw函式. 示例如下:

//es6中的塊級作用域

console.log(a); //referenceerror

//throw函式實現

catch(a)

}console.log(a); //referenceerror

之前我在看別人的**的時候覺得用throw好像很高階, 可能是為了實現塊級作用域吧.

當有多個變數時, 我們一般不用a, 而是用err123456等.

如果用babel編譯一下如上**, 會發現編譯出來的es5與上面的方案都不同, 它是這麼編譯的.

//es6中的塊級作用域1

console.log(a); //referenceerror

//babel編譯1

"use strict";

console.log(a); //referenceerror

//es6中的塊級作用域2

console.log(a);

console.log(_a);

//babel編譯2

"use strict";

console.log(a);

console.log(_a);

哈哈, 是不是很優雅? 雖然會在全域性初始化_a等變數, 但是沒有太大的問題.

js塊級作用域

首先看乙個常見的函式,該函式輸出的是什麼呢?對的,就是5個6.為什麼會這樣呢?因為settimeout是個非同步函式,每次迴圈的時候都會建立乙個定時器,任務放到佇列裡,等主線程執行完才會執行定時器,這個時候迴圈跑完了,最後一次的 i 5 1 6,所以輸出5個6.for var i 1 i 5 i 1...

js塊級作用域

在了解這兩個api前,我們先了解一下塊級作用域這個概念。定義 是乙個語句,將多個操作封裝在一起,通常是放在乙個大括號裡,沒有返回值。為何需要塊級作用域?在es6之前,函式只能在全域性作用域和函式作用域中宣告,不能在塊級作用域中宣告。沒有塊級作用域導致很多場景不合理 1 記憶體變數可能覆蓋外層變數 v...

js中的詞法作用域,this和塊級作用域

js中的詞法作用域,this和塊級作用域 箭頭函式的this會忽略物件,塊級作用域。func3 a undefined 以下來自 當我們將箭頭函式直接用於物件的方法時,this的指向就發生了變化 varobj console.log obj.getage uncaught typeerror can...