eval和new Function的區別
阿新 • • 發佈:2018-08-04
light console ole 運行環境 相同 fun glob rip UNC
eval和new Function都可以動態解析和執行字符串。但是它們對解析內容的運行環境判定不同。
var a = ‘global scope‘ function b(){ var a = ‘local scope‘ eval(‘console.log(a)‘) //local scope ;(new Function(‘‘,‘console.log(a)‘))() //global scope } b()
eval中的代碼執行時的作用域為當前作用域。它可以訪問到函數中的局部變量。
new Function中的代碼執行時的作用域為全局作用域,不論它的在哪個地方調用的。所以它訪問的是全局變量a。它根本無法訪問b函數內的局部變量。
註意,當我們在b函數中不定義變量a時,兩種方法的輸出相同。這與上述結論並不沖突。因為代碼執行時,對變量的查找是從內到外的。當eval中的代碼執行時,它依然是優先從b函數內部查找a變量,當查找不到時,再到全局中查找a,這時找到的a當然是‘global scope‘。
var a = ‘global scope‘ function b(){ //var a = ‘local scope‘ eval(‘console.log(a)‘) //global scope ;(new Function(‘‘,‘console.log(a)‘))() //global scope } b()
eval和new Function的區別