JavaScript中的eval()函數(shù)使用介紹
在JavaScript中,可以使用eval()函數(shù)來(lái)解析字符串中的JavaScript代碼,并返回相應(yīng)的代碼執(zhí)行結(jié)果:
console.log(eval("42 * 2"));//84
就本質(zhì)而言,eval()是JavaScript全局對(duì)象的一個(gè)函數(shù)。比如,上述代碼等價(jià)于:
console.log(this.eval("42 * 2"));//84
不過(guò)在使用eval()語(yǔ)句時(shí),一般都采用上述第一種做法,也即忽略全局對(duì)象直接使用eval()。
eval()的使用
基于以下兩個(gè)原因,除非確實(shí)需要,不然應(yīng)盡量避免在代碼中使用eval()語(yǔ)句:
1.從邏輯上來(lái)說(shuō),字符串應(yīng)該用于儲(chǔ)存程序運(yùn)行過(guò)程中的內(nèi)容、信息,而不應(yīng)該用于儲(chǔ)存具體的計(jì)算邏輯。
2.由于eval()參數(shù)為字符串,而對(duì)于一段字符串無(wú)法詞法進(jìn)行,因此對(duì)于eval()調(diào)用語(yǔ)句,JavaScript解釋器無(wú)法進(jìn)行優(yōu)化。
eval()的返回值
eval()的返回值遵循以下規(guī)則:
1.如果eval()的參數(shù)不是字符串,那么eval()將直接返回參數(shù)。
2.如果eval()的參數(shù)是字符串,那么eval()將這個(gè)字符串解析成代碼后進(jìn)行執(zhí)行,并返回最后一行代碼執(zhí)行的結(jié)果。
3.如果字符串無(wú)法解析成合法的代碼,eval()將拋出SyntaxError錯(cuò)誤。
4.如果字符串能夠被解析成合法的代碼,但是在執(zhí)行這一代碼過(guò)程中報(bào)錯(cuò),那么這個(gè)錯(cuò)誤會(huì)上報(bào)給eval()語(yǔ)句,并由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().
變量環(huán)境(variable environment)
JavaScript中eval()有一個(gè)重要的特性:eval()參數(shù)字符串中的代碼可以訪問(wèn)外部代碼中的變量,同時(shí)也可以將參數(shù)字符串代碼中新建的變量暴露給外部代碼。也即,如果eval()參數(shù)字符串可以被合法解析,那么JS會(huì)將解析后的代碼替換掉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
值得注意的是,實(shí)現(xiàn)上述特性的前提是eval()參數(shù)字符串中的代碼可以被合法解析。除了代碼語(yǔ)法正確外,JS還要求eval()參數(shù)字符串中的代碼必須“自成一體”:僅就參數(shù)字符串中的代碼而言,代碼必須是有意義的。比如,無(wú)法將諸如“return;”這樣的字符串傳給eval()函數(shù):
function test(){
var s = "test";
eval("return s;");
}
test();//SyntaxError: return not in function
如果直接使用eval()函數(shù),那么eval()參數(shù)字符串中的代碼所訪問(wèn)的變量是eval()語(yǔ)句所在function的那些變量,也即eval()函數(shù)所使用的變量環(huán)境是“本地變量環(huán)境”。如果不直接使用eval()函數(shù),而是使用一個(gè)同樣指向eval()函數(shù)的新變量,那么相應(yīng)參數(shù)字符串中的代碼所訪問(wèn)的變量均為全局變量,也即eval()函數(shù)所使用的變量環(huán)境是“全局變量環(huán)境”:
//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
不過(guò),值得注意的是,IE6、7、8中的行為與此不同。在IE6、7、8中,即使eval()函數(shù)被重命名,所使用的也依然是“本地變量環(huán)境”。
- JavaScript中eval()函數(shù)用法詳解
- JS使用eval()動(dòng)態(tài)創(chuàng)建變量的方法
- js中eval()函數(shù)和trim()去掉字符串左右空格應(yīng)用
- js中的eval()函數(shù)把含有轉(zhuǎn)義字符的字符串轉(zhuǎn)換成Object對(duì)象的方法
- JavaScript中的eval()函數(shù)詳解
- javascript eval()用法
- JavaScript eval() 函數(shù)介紹及應(yīng)用示例
- 對(duì)js eval()函數(shù)的一些見(jiàn)解
- JavaScript eval()函數(shù)定義及使用方法詳解
- js中eval方法詳解之eval方法的初級(jí)應(yīng)用
相關(guān)文章
javascript 大中小字體顯示實(shí)現(xiàn)代碼
有時(shí)候頁(yè)面中的正文一般都加上了字體大中小控制代碼,方便瀏覽者閱讀。2010-09-09javascript 頁(yè)面只自動(dòng)刷新一次
記得meta標(biāo)簽當(dāng)中有一個(gè)refresh的功能嗎?這是讓瀏覽的頁(yè)面刷新并可以轉(zhuǎn)到相應(yīng)的頁(yè)面,如果刷新本頁(yè)的話就會(huì)造成重復(fù)的刷新,現(xiàn)在我們就試試用腳本來(lái)實(shí)現(xiàn)只讓頁(yè)面刷新一次.2009-07-07替代window.event.srcElement效果的可兼容性的函數(shù)
getEvent()方法可模擬window.event效果2009-12-12微信小程序?qū)崿F(xiàn)搜索指定景點(diǎn)周邊美食、酒店
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)搜索指定景點(diǎn)周邊美食、酒店的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記一:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)對(duì)象成員的定義分析
這篇文章主要介紹了《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)對(duì)象成員的定義,結(jié)合實(shí)例形式分析了《javascript設(shè)計(jì)模式》中JavaScript面向?qū)ο蟪绦蛟O(shè)計(jì)的原理、定義、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04javascript中l(wèi)ocalStorage本地存儲(chǔ)(新增、刪除、修改)使用詳細(xì)教程
本地存儲(chǔ)localstorage是一種在瀏覽器中存儲(chǔ)數(shù)據(jù)的方式,可以將數(shù)據(jù)保存在用戶(hù)的本地計(jì)算機(jī)上,以便在下一次訪問(wèn)網(wǎng)站時(shí)使用,下面這篇文章主要給大家介紹了關(guān)于javascript中l(wèi)ocalStorage本地存儲(chǔ)(新增、刪除、修改)使用詳細(xì)教程,需要的朋友可以參考下2023-05-05uni-app網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)緩存實(shí)例詳解
這篇文章主要介紹了uni-app網(wǎng)絡(luò)請(qǐng)求、數(shù)據(jù)緩存的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11Express框架中_router?對(duì)象數(shù)據(jù)結(jié)構(gòu)使用詳解
這篇文章主要為大家介紹了Express框架中_router的對(duì)象數(shù)據(jù)結(jié)構(gòu)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03js調(diào)用瀏覽器打印模塊實(shí)現(xiàn)點(diǎn)擊按鈕觸發(fā)自定義函數(shù)
把瀏覽器打印的功能保留并賦予到自己添加的按鈕當(dāng)中,可以在點(diǎn)擊按鈕的同時(shí)觸發(fā)自定義的函數(shù)2014-03-03微信小程序?qū)崿F(xiàn)頁(yè)面下拉刷新和上拉加載功能詳解
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)頁(yè)面下拉刷新和上拉加載功能,結(jié)合實(shí)例形式分析了微信小程序頁(yè)面下拉刷新和上拉加載相關(guān)事件監(jiān)聽(tīng)與功能實(shí)現(xiàn)操作技巧,需要的朋友可以參考下2018-12-12