讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議154:慎重使用動態作用域 >

建議154:慎重使用動態作用域

無論是with表達式,還是try catch表達式的catch子句,抑或是包含的函數,都被認為是動態作用域。一個動態作用域只因代碼運行而存在,因此無法通過靜態分析(代碼結構)來確定是否存在動態作用域,例如:


function execute(code){(code);

function subroutine{

return window;

}

var w=subroutine;

};


execute函數看上去像一個動態作用域,因為它使用了。w變量的值與code有關。在大多數情況下,w將等價於全局的window對象,但下列情況除外。


execute("var window={};")


在這種情況下,由於在execute函數中創建了一個局部window變量,所以w將等價於這個局部總的window變量而不等價全局中的那個window變量。所以說,不運行這段代碼是沒有辦法瞭解具體情況的,因為標識符window的確切含義不能預先確定。

優化的JavaScript引擎,如Safari的Nitro引擎,企圖通過分析代碼來確定哪些變量應該在任意時刻被訪問,以加快標識符識別過程。這些引擎企圖避開傳統作用域鏈查找,以標識符索引的方式進行快速查找。在涉及一個動態作用域後,此優化方法就不起作用了。正是這個原因,只在絕對必要時才推薦使用動態作用域。