摘要:也自己試了一下,發(fā)現(xiàn)確實(shí)不能運(yùn)行字符串里面的代碼。那么現(xiàn)在答案很明顯了,既是不支持第一個(gè)參數(shù)為字符串的調(diào)用。在原先的問(wèn)題中,如果是的話,由于的第一個(gè)參數(shù)支持的是函數(shù)或者是表達(dá)式,所以字符串會(huì)被自動(dòng)執(zhí)行,將這個(gè)字符串強(qiáng)制轉(zhuǎn)換成一個(gè)函數(shù)。
今天閑來(lái)沒(méi)事的時(shí)候,去逛逛segementFault,看了看別人提的問(wèn)題。說(shuō)到setTimeout和window.onload沖突。一開始我是挺疑惑他表他什么意思的,因?yàn)閟etTimeout和window.onload應(yīng)該不會(huì)有明顯的沖突吧。帶著疑惑去追問(wèn)。后來(lái)貼出代碼的時(shí)候我就明白了,來(lái)看看他的代碼中的疑惑吧。
window.onload=function(){ setTimeout("D.style.background="#990033"",2000); }
他覺得這個(gè)代碼運(yùn)行的時(shí)候,setTimeout會(huì)報(bào)錯(cuò),不能正確的運(yùn)行指定的代碼,就覺得在window.onload和setTimeout有沖突。
我對(duì)這個(gè)問(wèn)題非常感興趣。也自己試了一下,發(fā)現(xiàn)確實(shí)不能運(yùn)行字符串里面的代碼。但是還是很懷疑window.onload和setTimeout怎么可能會(huì)有沖突呢?
解決問(wèn)題為了測(cè)試方便,我就稍微改動(dòng)了一下代碼。將setTimeout的調(diào)用改成調(diào)用函數(shù)。
window.onload = function() { function myFun(i) { alert(1); } setTimeout("myFun(1)", 2000); }
在這里發(fā)現(xiàn)的確不能運(yùn)行,但是這里的問(wèn)題就很明顯了,我將函數(shù)的調(diào)用變成了 "myFun(1)" 的字符串調(diào)用,所以會(huì)出現(xiàn)不能調(diào)用 myFun() 的問(wèn)題。
為了深入理解我們?cè)赪3school查詢一下setTimeout的用法。
那么就是setTimeout只能接受函數(shù)或者是表達(dá)式的計(jì)算。那么現(xiàn)在答案很明顯了,既是setTimeout不支持第一個(gè)參數(shù)為字符串的調(diào)用。
但是按照提問(wèn)者的用法,這種 "D.style.background="#990033"" CSS的調(diào)用也必須準(zhǔn)守這種形式那么怎么辦?
那么就服從setTimeout的規(guī)則,說(shuō)干就干,將他裝換成函數(shù)就好了。見以下代碼。
window.onload=function(){ setTimeout(function(){ D.style.background="#990033" },2000); }
這里的2秒鐘之后就會(huì)執(zhí)行setTimeout里面的匿名函數(shù),即準(zhǔn)守了setTimeout的原則,也可以利用setTimeout來(lái)調(diào)用類似字符串的形式的功能代碼。
回到提問(wèn)并且深入挖掘回到提出的問(wèn)題上來(lái),深入的挖掘,其實(shí)并不是setTimeout和window.onload有沖突,在原來(lái)的問(wèn)題中,其實(shí)是Javascript作用域在作怪。
在原先的問(wèn)題中,如果是 setTimeout("D.style.background="#990033"",2000); 的話,由于setTimeout的第一個(gè)參數(shù)支持的是函數(shù)或者是表達(dá)式,所以字符串會(huì)被自動(dòng)執(zhí)行 new Function ,將這個(gè)字符串強(qiáng)制轉(zhuǎn)換成一個(gè)函數(shù)。
我們知道在Javascript中,函數(shù)里面有自己的作用域,和外界的作用域不同,而在函數(shù)內(nèi)部并沒(méi)有D.style.background這個(gè)對(duì)象,所以會(huì)有報(bào)錯(cuò)。在我變化的例子中,也是如此,如果使用了 setTimeout("myFun(1)", 2000),那么這里面的字符串就會(huì)被自動(dòng)執(zhí)行 new Function ,所以創(chuàng)建出來(lái)的函數(shù)不在這個(gè)作用域內(nèi),當(dāng)然也就不能調(diào)用,會(huì)出現(xiàn)無(wú)法找到的問(wèn)題了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/87993.html
摘要:前端基礎(chǔ)進(jìn)階正是圍繞這條線索慢慢展開,而事件循環(huán)機(jī)制,則是這條線索的最關(guān)鍵的知識(shí)點(diǎn)。特別是中正式加入了對(duì)象之后,對(duì)于新標(biāo)準(zhǔn)中事件循環(huán)機(jī)制的理解就變得更加重要。之后全局上下文進(jìn)入函數(shù)調(diào)用棧。 showImg(https://segmentfault.com/img/remote/1460000008811705); JavaScript的學(xué)習(xí)零散而龐雜,因此很多時(shí)候我們學(xué)到了一些東西,但...
摘要:事件觸發(fā)線程主要負(fù)責(zé)將準(zhǔn)備好的事件交給引擎線程執(zhí)行。進(jìn)程瀏覽器渲染進(jìn)程瀏覽器內(nèi)核,主要負(fù)責(zé)頁(yè)面的渲染執(zhí)行以及事件的循環(huán)。第二輪循環(huán)結(jié)束。 將自己讀到的比較好的文章分享出來(lái),大家互相學(xué)習(xí),各位大佬有好的文章也可以留個(gè)鏈接互相學(xué)習(xí),萬(wàn)分感謝! 線程與進(jìn)程 關(guān)于線程與進(jìn)程的關(guān)系可以用下面的圖進(jìn)行說(shuō)明: showImg(https://segmentfault.com/img/bVbjSZt?...
摘要:事件觸發(fā)線程主要負(fù)責(zé)將準(zhǔn)備好的事件交給引擎線程執(zhí)行。進(jìn)程瀏覽器渲染進(jìn)程瀏覽器內(nèi)核,主要負(fù)責(zé)頁(yè)面的渲染執(zhí)行以及事件的循環(huán)。第二輪循環(huán)結(jié)束。 將自己讀到的比較好的文章分享出來(lái),大家互相學(xué)習(xí),各位大佬有好的文章也可以留個(gè)鏈接互相學(xué)習(xí),萬(wàn)分感謝! 線程與進(jìn)程 關(guān)于線程與進(jìn)程的關(guān)系可以用下面的圖進(jìn)行說(shuō)明: showImg(https://segmentfault.com/img/bVbjSZt?...
摘要:徹底搞懂執(zhí)行機(jī)制首先我們大家都了解的是,是一門單線程語(yǔ)言,所以我們就可以得出是按照語(yǔ)句順序執(zhí)行的首先看這個(gè)顯然大家都知道結(jié)果,依次輸出,然而換一種這個(gè)時(shí)候再看代碼的順序執(zhí)行,輸出,,,。不過(guò)即使主線程為空,也是達(dá)不到的,根據(jù)標(biāo)準(zhǔn),最低是。 徹底搞懂JavaScript執(zhí)行機(jī)制 首先我們大家都了解的是,JavaScript 是一門單線程語(yǔ)言,所以我們就可以得出: JavaScript 是...
閱讀 1386·2021-11-25 09:43
閱讀 3606·2021-11-10 11:48
閱讀 5180·2021-09-23 11:21
閱讀 1610·2019-08-30 15:55
閱讀 3519·2019-08-30 13:53
閱讀 1247·2019-08-30 10:51
閱讀 880·2019-08-29 14:20
閱讀 1986·2019-08-29 13:11