3 回答

TA貢獻1839條經(jīng)驗 獲得超15個贊
1、和其他解釋性語言一樣,javascript 同樣可以解釋運行由javascript源代碼組成的字符串,javascript 通過eval()來完成。
2、 eval() 其實是一個函數(shù),是javascript很早版本中就已經(jīng)存在,但是javascript設(shè)計者和解釋器對其進行了許多的限制,看起來eval更像一個運算符。
但是作為用于動態(tài)執(zhí)行代碼,eval存在這樣的問題,解釋器無法對動態(tài)代碼做進一步的優(yōu)化。如果將它看做一個函數(shù),那它是可以被賦予其他名字的:
var A = eval;
var B = A;
如果是這樣的話,那么解釋器就無法優(yōu)化調(diào)用B()的函數(shù)了。因此設(shè)計者賦予eval一些運算符的特性(作為保留字)之后這些問題得到解決。當(dāng)然它還有更多的限制,留待讀者慢慢體會。
擴展資料
javascript中eval的用法代碼:
1、var globalEval = eval; //定義全局eval函數(shù)別名
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條經(jīng)驗 獲得超3個贊
JavaScript eval() 函數(shù)
JavaScript 全局對象
定義和用法:
eval() 函數(shù)可計算某個字符串,并執(zhí)行其中的的 JavaScript 代碼。
語法:
eval(string)
返回值:
通過計算 string 得到的值(如果有的話)。
說明:
該方法只接受原始字符串作為參數(shù),如果 string 參數(shù)不是原始字符串,那么該方法將不作任何改變地返回。因此請不要為 eval() 函數(shù)傳遞 String 對象來作為參數(shù)。
如果試圖覆蓋 eval 屬性或把 eval() 方法賦予另一個屬性,并通過該屬性調(diào)用它,則 ECMAScript 實現(xiàn)允許拋出一個 EvalError 異常。
拋出:
如果參數(shù)中沒有合法的表達式和語句,則拋出 SyntaxError 異常。
如果非法調(diào)用 eval(),則拋出 EvalError 異常。
如果傳遞給 eval() 的 Javascript 代碼生成了一個異常,eval() 將把該異常傳遞給調(diào)用者。
擴展資料:
調(diào)用eval函數(shù)的三種情況:
1、直接調(diào)用
直接調(diào)用時,eval函數(shù)相關(guān)的執(zhí)行環(huán)境屬性ThisBinding,LexicalEnvironment,VariableEnvironment的值如下:
a) ThisBinding是調(diào)用eval函數(shù)時,調(diào)用方執(zhí)行環(huán)境的ThisBinding
b) LexicalEnvironment是調(diào)用eval函數(shù)時,調(diào)用方執(zhí)行環(huán)境的LexicalEnvironment
c) VariableEnvironemnt是調(diào)用eval函數(shù)時,調(diào)用方執(zhí)行環(huán)境的VariableEnvironment
2、間接調(diào)用
所謂間接調(diào)用,即將eval賦值給另一個變量后在調(diào)用
3、嚴格模式下的eval
在嚴格模式下,eval的LexicalEnvironment,VariableEnvironment指向?qū)儆趀val自己的Lexcial Environment,而不是調(diào)用方的Lexical Environment,但是ThisBinding還是調(diào)用方的ThisBinding。
同時,在嚴格模式下如果eval直接調(diào)用,那么eval的Lexical Environment的outer指針指向調(diào)用方的Lexical Environment,否則,如果是間接調(diào)用,那么eval的Lexical Environment的outer指針指向全局環(huán)境的Lexical Environment。

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