eval()是一個全域函數,javascript透過eval()來解釋執行由javascript原始碼組成的字串
var result = eval('3+2'); console.log(result,typeof result);//5 'number'
用法
eval()只有一個參數,如果傳入的參數不是字串,它直接回傳這個參數。如果參數是字串,它會把字串當成javascript程式碼編譯。如果編譯失敗則拋出一個語法錯誤(syntaxError)異常。如果編譯成功,則開始執行這段程式碼,並傳回字串中的最後一個表達式或語句的值,如果最後一個表達式或語句沒有值,則最終會傳回undefined。如果字串拋出一個異常,這個異常就會把該呼叫傳遞給eval()
var num = 1; var str = 'test'; console.log(eval(num));//1 console.log(eval(str));//ReferenceError: test is not defined var strLong1 = 'var x = 1;var y = 2;'; console.log(eval(strLong1),x,y);//undefined 1 2 var strLong2 = 'var x = 1; x++;'; console.log(eval(strLong2),x);//1 2
作用域
#eval()使用了呼叫它的變數作用域環境。也就是說,它會尋找變數的值和定義新變數和函數的運算和局部作用域中的程式碼完全一樣
var b = 2; function foo(str,a){ eval(str); console.log(a,b); } foo('var b = 3;',1);//1 3
別名
當透過別名呼叫時,eval()會將其字串當作頂層的全域程式碼來執行。執行的程式碼可能會定義新的全域變數和全域函數,或為全域變數賦值,但不能使用或修改函數中的局部變數
var geval = eval; var x = 'global',y = 'global'; function f(){ var x = 'local'; eval('x += "changed";'); return x; } function g(){ var y = 'local'; geval('y += "changed";'); return y; } console.log(f(),x);//localchanged global console.log(g(),y);//local globalchanged
[注意]IE8-瀏覽器透過別名呼叫eval()和正常呼叫eval()的結果相同
副作用
## javascript解釋器進行了大量的程式碼分析和優化。而eval()的問題在於,用於動態執行的程式碼通常無法分析,於是解釋器也無法對其進行最佳化,這會導致效能下降嚴格模式
'use strict'; eval('var x = 1;'); console.log(x);//ReferenceError: x is not defined 'use strict'; var x = 1; eval('x = 2;'); console.log(x);//2
'use strict'; var eval = 10;//SyntaxError: Unexpected eval or arguments in strict mode
以上是JavaScript全域函數eval定義、用法和副作用等實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!