第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

setTimeout第一個參數(shù)執(zhí)行域的問題

setTimeout第一個參數(shù)執(zhí)行域的問題

不負(fù)相思意 2019-04-19 22:15:56
最開始寫的代碼是這樣的,后來找到原因說setTimeout是window方法,而a是私有域里的,所以找不到。(function a(){document.write('1');setTimeout('a()',2000);})();但為什么改為下面的寫法就可以了呢?(function a(){document.write('1');setTimeout(a,2000);})();不介意多講講,謝謝。
查看完整描述

10 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個贊

setTimeout函數(shù)的第一個參數(shù)可以是Function, 也可以是String代碼字符串。string寫法是不推薦的,但可以運(yùn)行。如果是傳入string,解析后變量的作用域就找不到了,只能直接在全局作用域中查找,這跟setTimeout是全局函數(shù)沒有關(guān)系;你的第二種寫法是傳遞的Function,它會從當(dāng)前作用域向上查找。實(shí)名函數(shù)在自身作用域內(nèi)可以調(diào)用自己,遞歸函數(shù)就經(jīng)常這樣寫function a() {a();};所以setTimeout 可以調(diào)用它,a里面所有函數(shù)都能調(diào)用a。

查看完整回答
反對 回復(fù) 2019-05-13
?
慕運(yùn)維8079593

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個贊

不好意思,最近沒上csdn, 復(fù)合型變量按值傳遞setTimeout(a, 2000), a變量這里指向一個內(nèi)存地址,當(dāng)然能找到他的作用域,但是如果你寫setTimeout("a()", 2000),這里的a()僅僅是一個字符串,按值傳遞,下次調(diào)用或者運(yùn)行的時候內(nèi)存在哪已經(jīng)不能確定了,肯定找不到作用域的啊。

查看完整回答
反對 回復(fù) 2019-05-13
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個贊

1),你自己也說了是()括起后a是私有setTimeout第一個參數(shù)是字符串時,調(diào)用到的函數(shù)必須是window作用域下的,所以訪問不到a函數(shù)

2)函數(shù)作為setTimeout參數(shù)時,內(nèi)部肯定可以訪問到a函數(shù),在同一個作用域內(nèi),所以不會報錯


查看完整回答
反對 回復(fù) 2019-05-13
?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個贊

setTimeout只要在執(zhí)行時能訪問到函數(shù)就不會報錯,不用一定在window作用域下的。就當(dāng)前作用域找最近的函數(shù),window下即使有函數(shù)a,也不會引用到,只是當(dāng)前作用域下的a。這個是作用域的問題,就近訪問最先訪問到的,找不到就報錯。字符串代碼時需要函數(shù),變量都是window下的

查看完整回答
反對 回復(fù) 2019-05-13
?
紅顏莎娜

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊

第一種寫法是有問題的。setTimeout('a()',2000);加了引號就跟字符串一樣,不是一個函數(shù),而且你這是準(zhǔn)備干嗎?為什么會把調(diào)用的方法放在方法內(nèi)部??沒看太懂,不應(yīng)該是定義一個函數(shù),在其他地方進(jìn)行調(diào)用嗎?


查看完整回答
反對 回復(fù) 2019-05-13
?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個贊

你這問的,跟setTimeout這個方法沒有關(guān)系,是JS參數(shù)語法的問題,你把變量用字符竄包起來系統(tǒng)不就認(rèn)為你傳進(jìn)來的是字符竄嗎,所以就沒有達(dá)到你預(yù)期的效果,是你自己本身理解不夠的問題


查看完整回答
反對 回復(fù) 2019-05-13
?
慕村225694

TA貢獻(xiàn)1880條經(jīng)驗(yàn) 獲得超4個贊

加了單引號,就變成字符串了,定時器的第一個參數(shù)應(yīng)該是個函數(shù)
(function a(){
document.write('1');
setTimeout(a,2000);
})();
自執(zhí)行函數(shù)(function(){})()
一開始你先執(zhí)行函數(shù)a所以頁面顯示1
然后定時器里你有回調(diào)了函數(shù)a啊,就構(gòu)成了一個不斷的循環(huán)。
頁面顯示的效果就是一開始有一個1,然后每延時2秒就多一個1.

查看完整回答
反對 回復(fù) 2019-05-13
?
富國滬深

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個贊

首先,你要的效果是每隔兩秒往頁面里輸出一個1

那么你在settimeout里面的函數(shù)寫法有問題,第一種寫法,‘a(chǎn)()’這是一個字符串,雖然后來又被解析了,但是這時候已經(jīng)是兩秒以后了,這時候并不是說a是私域里的變量所以找不到之類的,而是因?yàn)槟氵@里找的是'a' 而不是a 這兩個是有本質(zhì)上的區(qū)別的,一個是字符串,一個是變量。
第二,如果按照你的寫法,把這里改正過來,寫成setTimeout(a(),2000); 這樣就更加不對了,這里估計(jì)你自己也明白,在這里a函數(shù)直接就被執(zhí)行了,而不是等到兩秒以后才執(zhí)行,所以這樣寫直接就死循環(huán)了。所以這樣寫也是不行的
第三,改成第二種寫法,這時候setTimeout里面的a代表的就是a函數(shù),所以會每隔兩秒鐘調(diào)用一次,這是正確的

查看完整回答
反對 回復(fù) 2019-05-13
?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個贊

里面要用函數(shù)名吧,上面講的都很好?。?!


查看完整回答
反對 回復(fù) 2019-05-13
  • 10 回答
  • 0 關(guān)注
  • 751 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號