1. 程式人生 > >利用eval()來“欺騙”JavaScript詞法作用域

利用eval()來“欺騙”JavaScript詞法作用域

代碼 rip foo 如果 color 動態 clas pos 不同的

我們知道,所謂“詞法作用域”就是按照代碼書寫時的樣子內部函數可以訪問函數外部的變量,如果函數外存在函數內所具有的同名變量,則函數內部要獲取該同名變量的值會屏蔽掉函數外的同名變量(本來就是兩個不同的變量,只是同名而已。另外註意,在同一個作用域是同一個變量,所以不要重復聲明,否則第二個聲明會被忽略)。

利用eval()可以“欺騙”詞法作用域:

function foo(str){
    eval(str);
    console.log(a);
}

var a=100;

foo("var a=12");   // 12

按道理應該輸出100,可實際上輸出是12,因為eval可以造成var a=12;這條語句就好像在eval()所在的位置一樣。這段代碼實際上在foo函數裏創建了變量b,所以自然屏蔽了函數外的變量b。

eval()可以動態插入代碼,但實際上對性能有影響,所以最好不要使用它。

利用eval()來“欺騙”JavaScript詞法作用域