3 回答

TA貢獻1839條經驗 獲得超15個贊
1、和其他解釋性語言一樣,javascript 同樣可以解釋運行由javascript源代碼組成的字符串,javascript 通過eval()來完成。
2、 eval() 其實是一個函數,是javascript很早版本中就已經存在,但是javascript設計者和解釋器對其進行了許多的限制,看起來eval更像一個運算符。
但是作為用于動態執行代碼,eval存在這樣的問題,解釋器無法對動態代碼做進一步的優化。如果將它看做一個函數,那它是可以被賦予其他名字的:
var A = eval;
var B = A;
如果是這樣的話,那么解釋器就無法優化調用B()的函數了。因此設計者賦予eval一些運算符的特性(作為保留字)之后這些問題得到解決。當然它還有更多的限制,留待讀者慢慢體會。
擴展資料
javascript中eval的用法代碼:
1、var globalEval = eval; //定義全局eval函數別名
2、var a ='global', b = 'global'; //全局變量
3、function c(){ var a = 'local'; //局部變量
4、eval('a+="changed"'); //直接更改局部變量的值
5、return a; //返回更改后的局部變量
6、function d(){ var b = 'local';
7、globalEval("b+='changed'");
8、return b;}
9、console.log(c(), a); //localchanged
10、globalconsole.log(d() , b) //local
11、globalchanged

TA貢獻1851條經驗 獲得超3個贊
JavaScript eval() 函數
JavaScript 全局對象
定義和用法:
eval() 函數可計算某個字符串,并執行其中的的 JavaScript 代碼。
語法:
eval(string)
返回值:
通過計算 string 得到的值(如果有的話)。
說明:
該方法只接受原始字符串作為參數,如果 string 參數不是原始字符串,那么該方法將不作任何改變地返回。因此請不要為 eval() 函數傳遞 String 對象來作為參數。
如果試圖覆蓋 eval 屬性或把 eval() 方法賦予另一個屬性,并通過該屬性調用它,則 ECMAScript 實現允許拋出一個 EvalError 異常。
拋出:
如果參數中沒有合法的表達式和語句,則拋出 SyntaxError 異常。
如果非法調用 eval(),則拋出 EvalError 異常。
如果傳遞給 eval() 的 Javascript 代碼生成了一個異常,eval() 將把該異常傳遞給調用者。
擴展資料:
調用eval函數的三種情況:
1、直接調用
直接調用時,eval函數相關的執行環境屬性ThisBinding,LexicalEnvironment,VariableEnvironment的值如下:
a) ThisBinding是調用eval函數時,調用方執行環境的ThisBinding
b) LexicalEnvironment是調用eval函數時,調用方執行環境的LexicalEnvironment
c) VariableEnvironemnt是調用eval函數時,調用方執行環境的VariableEnvironment
2、間接調用
所謂間接調用,即將eval賦值給另一個變量后在調用
3、嚴格模式下的eval
在嚴格模式下,eval的LexicalEnvironment,VariableEnvironment指向屬于eval自己的Lexcial Environment,而不是調用方的Lexical Environment,但是ThisBinding還是調用方的ThisBinding。
同時,在嚴格模式下如果eval直接調用,那么eval的Lexical Environment的outer指針指向調用方的Lexical Environment,否則,如果是間接調用,那么eval的Lexical Environment的outer指針指向全局環境的Lexical Environment。

TA貢獻1796條經驗 獲得超10個贊
eval通常用在ajax上,而且也有eval的替代方法,完全可以拋棄eval這種東西。我看了源代碼發現在jquery 1.4中也拋棄了直接使用eval,用eval實在很容易被攻擊。
真想不到為什么在跟隨鼠標運動的文字中會用到eval這個危險的東西。難道有從服務器傳輸鼠標位置的數據?要不就是這段代碼是哪個菜鳥看了哪本國內的垃圾教材寫的,然后不幸被你看到?
首先要知道,通過http傳輸的是字符串。
瀏覽器接收到字符串以后,是不會當作javascript命令來解析的。
這時候用eval命令,就可以把字符串當做JavaScript命令來執行。這同時也就存在風險,因為傳輸過來的字符串可能是惡意代碼。
還原這段代碼如下:
var curelement = layerref["layername"];
從這里就很容看出,curelement是變量,layerref是對象,layername是layerref對象的成員。至于是屬性還是方法,要看代碼里面是怎么寫的了。
添加回答
舉報