盤點JavaScript中Eval函數(shù)的使用方法
一、前言
內(nèi)建函數(shù) eval 函數(shù)允許執(zhí)行一個代碼字符串。
語法 :
let result = eval(code);
例 :
let code = 'alert("Hello")';
eval(code); // Hello
運行結果:
代碼字符串可能會比較長,包含換行符、函數(shù)聲明和變量等。
eval 的結果是最后一條語句的結果。
例:
let value = eval('1+1');
alert(value); // 2
let value = eval('let i = 0; ++i');
alert(value); // 1
運行結果:
eval 內(nèi)的代碼在當前詞法環(huán)境(lexical environment)中執(zhí)行,因此它能訪問外部變量:
let a = 1;
function f() {
let a = 2; eval('alert(a)');
// 2
}
f();
運行結果:
它也可以更改外部變量:
let x = 5;
eval("x = 10");
alert(x); // 10,值被更改了
運行結果:
嚴格模式下,eval 有屬于自己的詞法環(huán)境。因此不能從外部訪問在 eval 中聲明的函數(shù)和變量:
// 提示:本教程所有可運行的示例都默認啟用了嚴格模式
'use strict'eval("let x = 5; function f() {}");
alert(typeof x); // undefined(沒有這個變量)
// 函數(shù) f 也不可從外部進行訪問
如果不啟用嚴格模式,eval 沒有屬于自己的詞法環(huán)境,因此可以從外部訪問變量 x 和函數(shù) f。
二、案例
Eval-計算器
創(chuàng)建一個計算器,提示用戶輸入一個算術表達式,并返回其計算結果。
讓使用 eval 來計算數(shù)學表達式:
let expr = prompt("Type an arithmetic expression?", '23+2');
alert( eval(expr) );
需要檢查表達式是否正確。只需要計算并返回結果。用戶可以輸入任意文本或代碼。
運行結果:
三、使用 “eval”
在 eval 中使用外部局部變量也被認為是一個壞的編程習慣,因為這會使代碼維護變得更加困難。
有兩種方法可以完全避免此類問題。
如果 \eval\ 中的代碼,+沒有使用外部變量,請以 window.\eval(...) 的形式調(diào)用 \eval\。
通過這種方式,該代碼便會在全局作用域內(nèi)執(zhí)行:
let x = 1;
{
let x = 5;
window.eval('alert(x)'); // 1(全局變量)
}
運行結果:
如果 \eval\ 中的代碼需要訪問局部變量,可以使用 new Function 替代 \eval\,并將它們作為參數(shù)傳遞:
let f = new Function('a', 'alert(a)');
f(5); // 5
運行結果:
注:
new Function 從字符串創(chuàng)建一個函數(shù),并且也是在全局作用域中的。所以它無法訪問局部變量。
四、總結
本文基于JavaScript基礎,介紹了 Eval函數(shù)的使用。調(diào)用 eval(code) 會運行代碼字符串,并返回最后一條語句的結果。
要在全局作用域中 eval 代碼,可以使用 window.eval(code) 進行替代。
通過案例的分析,進行詳細的講解。在實際應用中需要注意的點,遇到的難點,提供了詳細的解決方法。使用JavaScript語言,能夠讓讀者更好的理解。代碼很簡單,希望能夠幫助讀者更好的學習。