在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 執(zhí)行eval('({"ok":"true&quot

執(zhí)行eval('({"ok":"true"})')返回了{(lán)ok: "true"},什么原理?

如下圖是在Chrome中得到的:

clipboard.png

問題:
首先,str代表的是一個(gè)json字符串,這點(diǎn)應(yīng)該是沒疑問的,然后我運(yùn)行eval('({"ok":"true"})')就返回了{ok: "true"},這里面是怎么實(shí)現(xiàn)的?是去看別人寫的項(xiàng)目的源碼中看到的,不明所以,請賜教~

回答
編輯回答
拮據(jù)

eval

避免在不必要的情況下使用 eval
eval() 是一個(gè)危險(xiǎn)的函數(shù), 他執(zhí)行的代碼擁有著執(zhí)行者的權(quán)利。如果你用 eval() 運(yùn)行的字符串代碼被惡意方(不懷好意的人)操控修改,您最終可能會(huì)在您的網(wǎng)頁/擴(kuò)展程序的權(quán)限下,在用戶計(jì)算機(jī)上運(yùn)行惡意代碼。更重要的是,第三方代碼可以看到某一個(gè)eval()被調(diào)用時(shí)的作用域,這也有可能導(dǎo)致一些不同方式的攻擊。相似的 Function 就不容易被攻擊。

eval() 通常比替代方法慢,因?yàn)樗仨氄{(diào)用 JS 解釋器,而許多其他結(jié)構(gòu)則由現(xiàn)代 JS 引擎進(jìn)行優(yōu)化。

在常見的案例中我們都會(huì)找更安全或者更快的方案去替換 eval()

2017年8月14日 15:15
編輯回答
情未了

eval函數(shù)接受字符串,然后把這個(gè)字符串當(dāng)作js代碼去運(yùn)行,返回運(yùn)行的結(jié)果。

eval('({"ok":"true"})')

相當(dāng)于運(yùn)行

({"ok":"true"})

返回對象{ok: "true"}

個(gè)人覺得需要注意的點(diǎn)是兩邊為什么要加括號?
因?yàn)?code>{}不僅可以用來聲明對象,還表示塊級作用域,
如果兩邊不加括號,會(huì)把{}當(dāng)成塊級作用域解析,就會(huì)報(bào)語法錯(cuò)誤;
加上括號,會(huì)把{}當(dāng)作對象聲明處理,所以就會(huì)生成一個(gè)新的對象,不會(huì)報(bào)語法錯(cuò)誤。

2017年5月2日 19:24
編輯回答
怪痞

eval() -- 你就想象成寫了一段代碼給瀏覽器解析,性質(zhì)是一樣的
如 let str = 'x={"ok":"true"}'; eval(str); 執(zhí)行之后 會(huì)在當(dāng)前作用域中創(chuàng)建一個(gè)x的變量 賦值為 {ok:'true'}
你上面的例子 eval('(' + str + ')'); <==> 等價(jià)于直接在瀏覽器中寫了一個(gè) {ok:'true'}
由于不是合格的表達(dá)式,eval中在兩邊加了括號

2018年1月17日 18:18