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