激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - JavaScript中的eval()函數使用介紹

JavaScript中的eval()函數使用介紹

2021-06-15 16:30junjie JavaScript

這篇文章主要介紹了JavaScript中的eval()函數使用介紹,本文講解了eval()的使用、eval()的返回值、變量環境(variable environment)等內容,需要的朋友可以參考下

在JavaScript中,可以使用eval()函數來解析字符串中的JavaScript代碼,并返回相應的代碼執行結果:

 

復制代碼 代碼如下:

console.log(eval("42 * 2"));//84

 


就本質而言,eval()是JavaScript全局對象的一個函數。比如,上述代碼等價于:

 

復制代碼 代碼如下:

console.log(this.eval("42 * 2"));//84

 


不過在使用eval()語句時,一般都采用上述第一種做法,也即忽略全局對象直接使用eval()。

 

eval()的使用

 

基于以下兩個原因,除非確實需要,不然應盡量避免在代碼中使用eval()語句:

1.從邏輯上來說,字符串應該用于儲存程序運行過程中的內容、信息,而不應該用于儲存具體的計算邏輯。
2.由于eval()參數為字符串,而對于一段字符串無法詞法進行,因此對于eval()調用語句,JavaScript解釋器無法進行優化。

 

eval()的返回值

 

eval()的返回值遵循以下規則:

 

1.如果eval()的參數不是字符串,那么eval()將直接返回參數。
2.如果eval()的參數是字符串,那么eval()將這個字符串解析成代碼后進行執行,并返回最后一行代碼執行的結果。
3.如果字符串無法解析成合法的代碼,eval()將拋出SyntaxError錯誤。
4.如果字符串能夠被解析成合法的代碼,但是在執行這一代碼過程中報錯,那么這個錯誤會上報給eval()語句,并由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().

 

 

變量環境(variable environment)

 

JavaScript中eval()有一個重要的特性:eval()參數字符串中的代碼可以訪問外部代碼中的變量,同時也可以將參數字符串代碼中新建的變量暴露給外部代碼。也即,如果eval()參數字符串可以被合法解析,那么JS會將解析后的代碼替換掉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

 


值得注意的是,實現上述特性的前提是eval()參數字符串中的代碼可以被合法解析。除了代碼語法正確外,JS還要求eval()參數字符串中的代碼必須“自成一體”:僅就參數字符串中的代碼而言,代碼必須是有意義的。比如,無法將諸如“return;”這樣的字符串傳給eval()函數:

 

復制代碼 代碼如下:

function test(){
  var s = "test";
  eval("return s;");
}
test();//SyntaxError: return not in function

 


如果直接使用eval()函數,那么eval()參數字符串中的代碼所訪問的變量是eval()語句所在function的那些變量,也即eval()函數所使用的變量環境是“本地變量環境”。如果不直接使用eval()函數,而是使用一個同樣指向eval()函數的新變量,那么相應參數字符串中的代碼所訪問的變量均為全局變量,也即eval()函數所使用的變量環境是“全局變量環境”:

 

復制代碼 代碼如下:

//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

 


不過,值得注意的是,IE6、7、8中的行為與此不同。在IE6、7、8中,即使eval()函數被重命名,所使用的也依然是“本地變量環境”。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 小视频在线看 | 亚洲第一男人天堂 | 巨乳毛片 | 精品国产三级a | 美女久久 | 亚洲 91| jizzyouxxxx | 2021国产精品视频 | 美国一级免费视频 | 国产亚洲欧美一区久久久在 | 视频在线91 | 欧美熟videos肥婆 | 深夜小视频在线观看 | 欧美精品v国产精品v日韩精品 | 国产xxxxx在线观看 | 在线中文字幕网站 | 黄色大片在线观看 | 久久成人精品视频 | 国产一区二区三区在线免费 | 羞羞视频免费网站男男 | 4399一级成人毛片 | 中文字幕在线观看精品 | 91久久久久久久一区二区 | 欧美a在线看 | 九一成人 | 亚洲国产馆 | v11av在线播放 | 美女福利视频国产 | 国产成人精品一区在线播放 | 国产宾馆3p国语对白 | 国产一区免费在线 | 操操日日 | 黄污网址 | 国产女同疯狂激烈互摸 | 操操插插 | 欧美精品一区二区久久 | 久久国产中文字幕 | 国产精品免费麻豆入口 | 在线91观看 | 国产人成免费爽爽爽视频 | 免费网站看v片在线a |