????:定義和用法 Eval它是用來計算某個字符串,并且執(zhí)行其中的JavaScript代碼?! ≌Z法 1) eval函數(shù)接受一個string這個參數(shù),并且這個參數(shù)是必須的,這個參數(shù)就是要計算的這個字符串。它里面可以函數(shù)含有JavaScript的表達(dá)式,或者要執(zhí)行的語句。 eval(string)。 2) 那,這個既然是函數(shù),就有可能有返回值。它的返回值是:如果這個string參數(shù)有返回值
定義和用法
Eval它是用來計算某個字符串,并且執(zhí)行其中的JavaScript代碼。
語法
1) eval函數(shù)接受一個string這個參數(shù),并且這個參數(shù)是必須的,這個參數(shù)就是要計算的這個字符串。它里面可以函數(shù)含有JavaScript的表達(dá)式,或者要執(zhí)行的語句。
eval(string)。
2) 那,這個既然是函數(shù),就有可能有返回值。它的返回值是:如果這個string參數(shù)有返回值的話,那這個函數(shù)就原樣返回這個string執(zhí)行完畢的結(jié)果。
3) 有一個地方值得注意,這個eval函數(shù)只接受原始的字符串作為參數(shù)。如果string參數(shù)不是原始字符串,那該方法將不做任何改變的返回。因此,我們不要為這個函數(shù)傳遞一些string對象來作為參數(shù)。并且,如果我們試圖覆蓋eval這個屬性,把eval函數(shù)賦值給另外一個屬性,有可能會拋出一些異常。
4) 并且,如果這個參數(shù)中沒有合法的表達(dá)式或者語句,有可能會拋出語法錯誤的異常。
可以看到,我們的eval函數(shù),功能非常強(qiáng)大。所以,我們在實際應(yīng)用中應(yīng)該要更加注意它的合法性、合理性。
查看示例
1. 看這一行示例
eval("x=10;y=20;document.write(x*y)");
我在里面給它傳遞進(jìn)入了一些執(zhí)行語句。
1) 我先賦值x=10,然后y=20。
2) 然后我再給x和y做一個乘法。
再把它們的結(jié)果輸出來。
那我們的eval函數(shù)會把這3條語句作為參數(shù),用來執(zhí)行。
我們看一下執(zhí)行結(jié)果,刷新瀏覽器。
看到了我們的x * y,也就是10 * 20,確實等于200。
這是我們的多條表達(dá)式語句。
2. 看另外一個例子:document.write(eval("2+2"));
1) 里面我們直接執(zhí)行2+2,那么它執(zhí)行的結(jié)果應(yīng)該是4。
2) 那么這eval函數(shù)返回這個4給document.write的輸出,那應(yīng)該輸出為4。
刷新瀏覽器,確實也得到了為4 的結(jié)果。
3. 再做一個簡單的示例
1) 例如我定義一個這樣的x變量。
var x = 10;
2) 然后我輸出它在里面用變量做一個計算。
document.write(eval(x+7));
3) 我們看它是不是返回我們想要的結(jié)果,應(yīng)該是返回17,刷新瀏覽器。
其實,它就是在這里x為10,10 加 7等于17,然后eval執(zhí)行完只有返回17,由document.write打印在頁面上。
這是我們在字符串下的eval函數(shù)的使用
在其它情況下的應(yīng)用
它的返回結(jié)果是怎么樣的?
1.辟如,這個:eval("2+3");
我們是直接傳了一個2 + 3在里面,它應(yīng)該會執(zhí)行,執(zhí)行完了之后它就會被返回5。
但是我們這里沒有做任何的輸出,所以我們應(yīng)該是看不到這個效果的,它是它仍然是會正常執(zhí)行的。
2. 那我們把這個eval函數(shù)賦值給這個變量:
var myeval = eval;
這個有可能會拋出來異常,所以我們在實際項目中,不建議這么使用。雖然我們在有些瀏覽器里面可能不會拋出異常。
1) 刷新瀏覽器:
它是執(zhí)行了下面的代碼:
var x = 10; document.write(eval(x+7)); eval("2+3"); var myeval = eval; try { alert("Result:" + eval(prompt("Enter an expression", ""))); } catch(e) { alert(e); }
2) 我們這個刷新,它并沒有拋出異常,所以它在Chrome瀏覽器里面應(yīng)該是可以正常執(zhí)行的。
3) 我們看一下這段代碼,這是用來檢測這個eval參數(shù)是否合法的。
try {
alert("Result:" + eval(prompt("Enter an expression", "")));
} catch(e) {
alert(e);
}
a) 首先使用 try catch 包裹起來。
b) 然后執(zhí)行了一個alert函數(shù),alert函數(shù)里面是Result這個字符串 + eval函數(shù)的返回值。
c) eval里面執(zhí)行了,彈出一個彈框,就是一個交互的對話框,供用戶輸入一個表達(dá)式。
然后作為執(zhí)行結(jié)果再返回。
刷新瀏覽器,這個彈出框是通過eval函數(shù)來執(zhí)行的,執(zhí)行的時候,它提示輸入一個表達(dá)式。
例如我輸入2+3,那eval函數(shù)執(zhí)行這個2+3之后,應(yīng)該會返回5,返回5之后,跟Resul這個字符串相接,然后傳遞給alert函數(shù),所以會彈出來一個5。
這就是eval函數(shù)在一些其它情況下的使用。
eval函數(shù)是如何解析JSON格式字符串的
1. 什么是Json格式的字符串呢?
Json是一種輕量級的數(shù)據(jù)交換格式,易于閱讀和編寫,同時也易于機(jī)器生成、解析。
2. 下面,我寫一個json格式的字符串。
1) Json字符串外面是一個大括號。
2) 里面就是類似于我們的字典一樣的。
3. 我們利用JavaScript內(nèi)置的eval函數(shù),將JSON格式的字符串轉(zhuǎn)換成json對象時,我們怎么操作?
1) 我們需要用一個小括號,先將這個字符串包住。
2) 例如上面的這個字符串,我給它賦值一個txt這樣的一個變量。
賦值變量的時候,我們需要用括號給它括起來。
外面用雙引號的時候,里面就要用單引號。
var txt = "{'userid':11,'name':'liyi'}";
3) 然后再解析,它會把這個字符串解析成json的對象。
然后通過我們的eval函數(shù),在里面加一對小括號。
然后把這個字符串連接起來。
var txtObj = eval("("+txt+")");
4) 這個時候,我們就把解析之后的對象的userid做一次輸出。
document.write(txtObj.userid);
刷新瀏覽器,它就將我們的json字符串解析成了一個json的對象。
通過這個對象的.,輸出了它的一個屬性。Userid為11。這就是我們想要的正確的結(jié)果。