eval()是全局對象的一個函數(shù)屬性。
eval()的參數(shù)是一個字符串。如果字符串表示的是表達式,eval()會對表達式進行求值。如果參數(shù)表示一個或多個JavaScript語句, 那么eval()就會執(zhí)行這些語句。注意不要用eval()來執(zhí)行一個四則運算表達式;因為 JavaScript 會自動為四則運算求值并不需要用eval來包裹。
這里的四則運算是指數(shù)學上的運算,如:3 + 4 * 4 / 6。注意這里面并沒有變量,只是單純的數(shù)學運算,這樣的運算式并不需要調(diào)用eval來計算,直接在代碼中計算就可以。其實即便帶有變量,JavaScript也是可以直接計算的,但是如果你現(xiàn)在只想聲明一個帶有變量的表達式,但是想稍后進行運算(你有可能在聲明這個帶有變量的運算式之后還有可能對里面的變量進行修改),就可以使用eval。
如果要將算數(shù)表達式構造成為一個字符串,你可以用eval()在隨后對其求值。比如,假如你有一個變量 x ,你可以通過一個字符串表達式來對涉及x的表達式延遲求值,將 “3 * x + 2”,存儲為變量,然后在你的腳本后面的一個地方調(diào)用eval()。 如果eval()的參數(shù)不是字符串,eval()將會將參數(shù)原封不動的返回。在下面的例子中,字符串構造器被指定,eval()返回了字符串對象而不是對字符串求值。
// 返回了包含"2 + 2"的字符串對象
eval(new String("2 + 2"));
// returns 4
eval("2 + 2");
eval() 是一個危險的函數(shù), 他執(zhí)行的代碼擁有著執(zhí)行者的權利。如果你用eval()運行的字符串代碼被惡意方(不懷好意的人)操控修改,您可能會利用最終在用戶機器上運行惡意方部署的惡意代碼,并導致您失去您的網(wǎng)頁或者擴展程序的權限。更重要的是,第三方代碼可以看到某一個eval()被調(diào)用時的作用域,這也有可能導致一些不同方式的攻擊。相似的Function就是不容易被攻擊的。
eval()的運行效率也普遍的比其他的替代方案慢,因為他會調(diào)用js解析器,即便現(xiàn)代的JS引擎中已經(jīng)對此做了優(yōu)化。 在常見的案例中我們都會找更安全或者更快的方案去替換他