10 回答

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。

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)不能確定了,肯定找不到作用域的啊。

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),所以不會報錯

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個贊
setTimeout只要在執(zhí)行時能訪問到函數(shù)就不會報錯,不用一定在window作用域下的。就當(dāng)前作用域找最近的函數(shù),window下即使有函數(shù)a,也不會引用到,只是當(dāng)前作用域下的a。這個是作用域的問題,就近訪問最先訪問到的,找不到就報錯。字符串代碼時需要函數(shù),變量都是window下的

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)用嗎?

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

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.

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)用一次,這是正確的
添加回答
舉報