1. 程式人生 > 實用技巧 >【JavaScript】標準內建函式 eval

【JavaScript】標準內建函式 eval

以下內容為學習記錄,可以參考 MDN 原文。

環境

  • node v12.18.1
  • npm 6.14.5
  • vscode 1.46
  • Microsoft Edge 83

概念

eval() 是全域性物件的一個函式屬性。

eval() 的引數是一個字串。如果字串表示的是表示式,eval() 會對錶達式進行求值。
如果引數表示一個或多個 JavaScript 語句,那麼eval() 就會執行這些語句。
不需要用 eval() 來執行一個算術表示式:因為 JavaScript 可以自動為算術表示式求值。

如果你以字串的形式構造了算術表示式,那麼可以在後面用 eval() 對它求值。
例如,假設你有一個變數 x,您可以通過將表示式的字串值(例如 3 * x + 2)賦值給一個變數,
然後在你的程式碼後面的其他地方呼叫 eval(),來推遲涉及 x 的表示式的求值。

如果 eval() 的引數不是字串, eval() 會將引數原封不動地返回。
在下面的例子中,String 構造器被指定,而 eval() 返回了 String 物件而不是執行字串。

eval(new String("2 + 2")); // 返回了包含"2 + 2"的字串物件
eval("2 + 2");             // returns 4

你可以使用一些通用的方法來繞過這個限制,例如使用 toString()。

var expression = new String("2 + 2");
eval(expression.toString());

如果你間接的使用 eval(),比如通過一個引用來呼叫它,而不是直接的呼叫 eval。
從 ECMAScript 5 起,它工作在全域性作用域下,而不是區域性作用域中。這就意味著,例如,下面的程式碼的作用宣告建立一個全域性函式,並且 eval 中的這些程式碼在執行期間不能在被呼叫的作用域中訪問區域性變數。

function test() {
  var x = 2, y = 4;
  console.log(eval('x + y'));  // 直接呼叫,使用本地作用域,結果是 6
  var geval = eval; // 等價於在全域性作用域呼叫
  console.log(geval('x + y')); // 間接呼叫,使用全域性作用域,throws ReferenceError 因為`x`未定義
  (0, eval)('x + y'); // 另一個間接呼叫的例子
​}

永遠不要使用 eval!