首頁  >  文章  >  web前端  >  JavaScript全域函數eval定義、用法和副作用等實例詳解

JavaScript全域函數eval定義、用法和副作用等實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-25 14:00:182608瀏覽

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()的問題在於,用於動態執行的程式碼通常無法分析,於是解釋器也無法對其進行最佳化,這會導致效能下降


  與eval()類似的有setTimeout ()、setInterval()、new Function()等,這些函數都可以以字串作為參數,在程式執行時動態執行。這種執行機制帶來的好處無法抵銷其效能上的損失,所以應該盡量避免使用


嚴格模式

由於eval( )函數過於強大,嚴格模式對其進行了嚴格的限制


【1】不能透過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

【2】禁止使用eval作為識別符



'use strict';
var eval = 10;//SyntaxError: Unexpected eval or arguments in strict mode

以上是JavaScript全域函數eval定義、用法和副作用等實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn