JavaScript中的eval()函數使用介紹_javascript技巧

來源:互聯網
上載者:User

在JavaScript中,可以使用eval()函數來解析字串中的JavaScript代碼,並返回相應的代碼執行結果:


複製代碼 代碼如下:

console.log(eval("42 * 2"));//84


就本質而言,eval()是JavaScript全域對象的一個函數。比如,上述代碼等價於:


複製代碼 代碼如下:

console.log(this.eval("42 * 2"));//84


不過在使用eval()語句時,一般都採用上述第一種做法,也即忽略全域對象直接使用eval()。

eval()的使用

基於以下兩個原因,除非確實需要,不然應盡量避免在代碼中使用eval()語句:

1.從邏輯上來說,字串應該用於儲存程式運行過程中的內容、資訊,而不應該用於儲存具體的計算邏輯。
2.由於eval()參數為字串,而對於一段字串無法詞法進行,因此對於eval()調用語句,JavaScript解譯器無法進行最佳化。

eval()的傳回值

eval()的傳回值遵循以下規則:

1.如果eval()的參數不是字串,那麼eval()將直接返回參數。
2.如果eval()的參數是字串,那麼eval()將這個字串解析成代碼後進行執行,並返回最後一行代碼執行的結果。
3.如果字串無法解析成合法的代碼,eval()將拋出SyntaxError錯誤。
4.如果字串能夠被解析成合法的代碼,但是在執行這一代碼過程中報錯,那麼這個錯誤會上報給eval()語句,並由eval()拋出。

複製代碼 代碼如下:

console.log(eval([1,2,3]));//[1, 2, 3]
console.log(typeof eval([1,2,3]));//object

console.log(eval("42 */ 2"));//SyntaxError
console.log(eval("42 * 2; 22 * 3;"));//66. eval returns the result of last expression/statement
console.log(eval("null.toString()"));//TypeError, exception in eval-ed code will be propagated outside eval().

變數環境(variable environment)

JavaScript中eval()有一個重要的特性:eval()參數字串中的代碼可以訪問外部代碼中的變數,同時也可以將參數字串代碼中建立的變數暴露給外部代碼。也即,如果eval()參數字串可以被合法解析,那麼JS會將解析後的代碼替換掉eval()所在的那一行:

複製代碼 代碼如下:

//variable environment
var a = 108;
console.log(eval("function double(x){return x*2;} a = double(a)"));
console.log(a);//216
console.log(double(33));//66


值得注意的是,實現上述特性的前提是eval()參數字串中的代碼可以被合法解析。除了代碼文法正確外,JS還要求eval()參數字串中的代碼必須“自成一體”:僅就參數字串中的代碼而言,代碼必須是有意義的。比如,無法將諸如“return;”這樣的字串傳給eval()函數:


複製代碼 代碼如下:

function test(){
  var s = "test";
  eval("return s;");
}
test();//SyntaxError: return not in function


如果直接使用eval()函數,那麼eval()參數字串中的代碼所訪問的變數是eval()語句所在function的那些變數,也即eval()函數所使用的變數環境是“本地變數環境”。如果不直接使用eval()函數,而是使用一個同樣指向eval()函數的新變數,那麼相應參數字串中的代碼所訪問的變數均為全域變數,也即eval()函數所使用的變數環境是“全域變數環境”:


複製代碼 代碼如下:

//local variable environment and global variable environment
var renamed = eval;
var x = "origin", y = "origin";
function f(){
  var x = "new";
  eval("x += 'Changed';");
  return x;
}
function g(){
  var y = "new";
  renamed("y += 'Changed';");
  return y;
}
console.log(f(), x);//newChanged origin
console.log(g(), y);//new originChanged


不過,值得注意的是,IE6、7、8中的行為與此不同。在IE6、7、8中,即使eval()函數被重新命名,所使用的也依然是“本地變數環境”。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.