詞法作用域 --《你不知道的JS》


1.什么是詞法作用域?

  詞法作用域就是定段的作用域。話說法作用域是由你在寫代碼時將變量和作用域寫在里來決定的,因此當法分析器理代碼時會保持作用域不變 。

2.欺騙詞法

怎么在才能在運行中 “修改”詞法作用域呢??

 

  答案:JavaScript中有兩種機制實現這個目的,不過值得注意的是欺騙詞法作用域會導致性能下降

  兩種機制如下

  1.eval() 函數    ---魔鬼

    函數可以接受一個字符串參數,這個字符相當於可以運行的JavaScript代碼,在執行eval之后,引擎並不知道eval是以動態的方式進入的,並對詞法環境進行修改。

function foo(str, a) {
    eval( str ); // 欺騙!
    console.log( a, b );
} 
var b = 2;
foo( "var b = 3;", 1 ); // 1, 3

  在執行eval之后,var b = 2; 會生成一個詞法環境,即在foo作用域里面定義了b變量,console.log訪問時首先會在自己的詞法作用域里尋找a,b變量。類似的有setTimeout(),setInterval();

  3.with()

      with通常被當作重復引用同一個象中的多個屬性的快捷方式,可以不需要重復引用象本身。

var obj = {
    a: 1,
    b: 2,
    c: 3
};
// 單調乏味的重復"obj"
obj.a = 2;
obj.b = 3;
obj.c = 4;
// 簡單的快捷方式
with (obj) {
    a = 3;
    b = 4;
    c = 5;
}

  3.性能

  JavaScript引擎會在編譯階行數的性能化。其中有些化依於能根據代詞行靜分析,並先確定所有量和函數的定位置,才能在程中快速找到標識符 。如果引擎在代發現eval(..)with.

它只能簡單地假關於標識符位置的判斷都是無效的,因無法在法分析段明確知道eval(..)會接收到什么代些代會如何作用域行修改,也無法知道傳遞給with用來建新法作用域的象的內容到底是什么。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM