鍍金池/ 問答/HTML/ setTimeout的問題

setTimeout的問題

setTimeout()接收兩個(gè)參數(shù),第一個(gè)參數(shù)為執(zhí)行的回調(diào),第二個(gè)參數(shù)是延時(shí)的時(shí)間。
第一個(gè)參數(shù)可以為字符串。

setTimeout("alert(1)",1000);
setTimeout(function(){alert(1)},1000);

這兩個(gè)都會(huì)在1秒后彈框,在《Javascript高級(jí)程序設(shè)計(jì)第三版》中明確指出第一種方式可能會(huì)導(dǎo)致性能缺失。但是為什么會(huì)性能缺失卻沒有詳細(xì)闡述,這里我想問的就是第一個(gè)參數(shù)傳遞字符串為什么會(huì)導(dǎo)致性能缺失?導(dǎo)致的是什么性能缺失?

回答
編輯回答
好難瘦

字符串要轉(zhuǎn)換成可執(zhí)行的代碼 類似多走了一遍eval

2018年7月10日 14:19
編輯回答
不將就

實(shí)質(zhì)上如果第一個(gè)參數(shù)填寫字符串的話是調(diào)用了eval()方法,以下是MDN對(duì)性能損失的解釋:

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

大致解釋以下,就是每一次運(yùn)行這段代碼都會(huì)重新調(diào)用JS解釋器,重新進(jìn)行解釋運(yùn)行,而優(yōu)化步驟比如V8引擎中JIT(Just In Time)優(yōu)化方法會(huì)失效。

2018年6月9日 05:03