函式是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...