日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

javascript - setTimeout第一個參數是立即執行函數,看不懂了

瀏覽:198日期:2023-03-05 13:39:59

問題描述

setTimeout第一個參數是立即執行函數,看不懂了

for (var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i); })(i), i * 1000);}

雖然結果是立即輸出0,1,2,3,4,但是不知道為啥

問題解答

回答1:

這樣其實是一下子全部打印出來的。。。不是每隔一秒打印出來。。建議這樣寫。。

for (var i = 0; i < 5; i++) { setTimeout((function(i) { return function() {console.log(i); } })(i), i * 1000);}

我來解釋一下這個為什么可以獲取到0、1、2、3、4.網上關于JS預解釋的文章也不少,在進入執行上下文階段的時候函數并不會執行,簡單來說就是當你聲明這個函數的時候,只要不調用就不會執行,上下文里面只會保存著這個函數的引用,可以看做這個函數保存在內存中,只有到調用的時候函數才會執行,我說說自己的理解,有不對的地方請指出來。如果沒有立即執行函數: 你在for循環里面實際上相當于定義了5個定時器,但是js是單線程,這五個函數會被放到隊列里面等待執行,舉個不一定恰當的例子,你就把這五個函數function() {console.log(i);}當成字符串保存到內存中,一直沒什么動靜,等到這五個函數調用執行的時候(就是setTimeout的第二個參數的時間到了的時候),才會開始執行這個函數,因為函數里面有個i,這個時候會通過作用域鏈來查找這個i,最后在外面的作用域里面查找到了i,但是這個時候for循環已經執行結束了,i已經變成4了,所以會打印出5個4.如果有立即執行函數(比如我上面寫的那個): 你在for循環里面實際上相當于定義了5個定時器,但是js是單線程,這五個函數會被放到隊列里面等待執行。

(function(i) {

return function() { console.log(i);}

})(i)

但是由于外面是立即執行函數,所以會立即就執行了,并且把i傳了進去,等到這五個函數執行的時候,向上查找i,正好在這個立即調用函數的作用域里面查找到了i,所以會打印出0、1、2、3、4.

回答2:

你先看括住整個function的那個括號也就是:

(function (i) { console.log(i);})

這一段,理解就是把自己包成一個包裹,是一個整體,這個整體是一個函數

那么接下來怎么調用函數呢?是不是函數名()這樣,在函數名后面加上括號,并且可以傳遞參數進去

所以很自然的,就出現了這樣:

(function (i) { console.log(i);})(i)

這種調用,就是寫個函數,用()包起來,在后面接個(),里面寫參數,就直接執行了

回答3:

就像樓上說的是立刻打印出來了,你的setTimeout根本就沒起作用。原因就是立即執行函數執行后沒有返回值,所以相當于setTimeout(undefined, i*1000)。

回答4:

setTimeout要求第1個參數是一個函數,這樣等第2個參數規定的時間到了之后,開始執行第1個參數定義的函數。

當你這么寫的時候:

for (var i = 0; i < 5; i++) { setTimeout(function(i) { console.log(i); }, i * 1000);}

你會注意到定時器已經起作用了,只不過是每隔1秒種打出來一個undefined。因為當執行這個函數的時候,i已經從循環中跳出,已經沒有值了。

所以你改成這樣:

for (var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i); })(i), i * 1000);}

但在這種情況下,第1個參數不是一個函數,而是一個表達式,也就是說會立即執行的函數,它不會等到計時器起作用才執行,而是只要一碰到就會執行,所以表現形式就是直接打出了0,1,2,3,4。

按照樓上的說法改成這樣:

for (var i = 0; i < 5; i++) { setTimeout((function(i) { return function() {console.log(i); } })(i), i * 1000);}

雖然第1個參數是一個表達式,還是會立即執行,但是這個表達式執行的結果不是輸出數值,而是返回一個函數,這就滿足了setTimeout對第1個參數是函數的要求,并且給定了正確的輸入參數,所以每隔1秒種會輸出一個正確的結果。

不過,為了團隊協作起見,我一般不建議這么寫,我建議還是規規矩矩按照setTimeout的標準寫法寫成這樣:

var j = 0;for (i = 0; i < 5; i++) { setTimeout(function() { console.log(j); j++; }, i * 1000);}

這樣至少對于組內其他成員讀起來更容易理解一些。

回答5:

因為是立即執行的函數啊,當然立即輸出了

回答6:

函數作用域問題,改變this指向就可以了。

for (var i = 0; i < 5; i++) { setTimeout((function(i) {console.log(i); }).bind(this,i), i * 1000);}回答7:

沒有立即執行函數的話,打印出來的是5個5,而且是每隔一秒打印,因為這里setTimeout里面的函數要等循環完成之后才會執行,這時全局變量i就是5了。使用立即執行函數,會獲取循環中的每一個i,這里有閉包的效果,這個i這時就是一個局部變量了,存在于此函數中,每次執行時變量i的值都不一樣。

回答8:

(function(i) { console.log(i);})(i)

聲明了馬上執行 這樣 就是 0 1 2 3 4

然而這個沒有返回值 因此默認是 undefined

因此你的代碼可以認為是這樣:

for (var i = 0; i < 5; i++) { var temp = (function(i) { console.log(i); })(i); // temp 是 undefined setTimeout(temp, i * 1000);}

javascript - setTimeout第一個參數是立即執行函數,看不懂了

回答9:

理解一下原理,閉包,堆棧,事件隊列,同步,異步

翻轉一下思路:把傳進去的參數i去掉,看看是不是能正常打印,不能的話,分析一下為什么

能不能換幾種寫法,實現上面一樣的效果,分析一下為什么完成上面的幾點,你就知道原因 過程 結果

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕日韩亚洲| 麻豆mv在线观看| 精品久久精品| 69精品国产久热在线观看| 欧美日本一区| 久久精品国产99国产| 欧美99久久| 日韩高清不卡一区| 亚洲1区在线观看| 深夜福利一区| 91成人小视频| 国产激情一区| 中文字幕一区久| 高清久久一区| av亚洲在线观看| 中文字幕av亚洲精品一部二部 | 国产一区二区精品福利地址| 精品不卡一区| 亚洲韩日在线| 日韩一区二区久久| 国产区精品区| 国产精品视频3p| 少妇精品久久久一区二区三区| 欧美日韩国产综合网| 狠狠干成人综合网| 中文无码日韩欧| 免费观看久久久4p| 国模大尺度视频一区二区| 欧美一区二区三区激情视频 | 欧美日韩99| 福利一区和二区| 日本蜜桃在线观看视频| 欧美亚洲三区| 亚洲91精品| 99视频精品视频高清免费| 精品一区二区三区的国产在线观看| 亚洲国产成人精品女人| 国产精品丝袜在线播放| 亚洲国产成人精品女人| 久久在线视频免费观看| 亚洲成人一区| 999在线观看精品免费不卡网站| 欧美gv在线| 亚洲精品在线观看91| 精品欧美视频| 亚洲视频综合| 黄色网一区二区| 精品久久久亚洲| 久久国产精品毛片| 久久中文在线| 美女视频黄久久| 欧美精品一二| 久久午夜影院| 欧美欧美黄在线二区| 天堂成人免费av电影一区 | 日韩激情一区二区| 日韩有吗在线观看| 精品视频高潮| 国产日韩欧美一区二区三区在线观看| 日韩成人综合| 欧美黄色一区| 在线成人直播| 国产综合婷婷| 国产精品亚洲欧美一级在线| 欧美激情aⅴ一区二区三区| 国产丝袜一区| 日韩一区二区三区免费| 蜜臀av一区二区在线免费观看| 欧美日韩亚洲国产精品| 日本aⅴ精品一区二区三区| 日韩在线网址| 久久精品国产www456c0m| 你懂的亚洲视频| 视频福利一区| 麻豆成人在线观看| 蜜桃视频一区二区| 欧美大黑bbbbbbbbb在线| 人人草在线视频| 国产精品久久| 欧美 日韩 国产一区二区在线视频 | 亚洲欧美视频一区二区三区| 国产白浆在线免费观看| 日韩精品欧美成人高清一区二区| 精品一区二区三区中文字幕 | 麻豆久久久久久| 亚洲精品电影| 91亚洲国产高清| 精品国产美女a久久9999| aa国产精品| 国产精品普通话对白| 亚洲日本久久| 亚洲专区视频| 日韩免费一区| 国产视频久久| 国产亚洲高清视频| 国产一二在线播放| 国产日韩一区二区三免费高清 | 91成人精品视频| 亚洲激情国产| 黄色在线观看www| 日韩一区二区三区高清在线观看| 蜜桃一区二区三区| 91精品国产自产精品男人的天堂| 国产精品一线天粉嫩av| 日韩精品欧美大片| 国产精品大片| 九九久久国产| 亚洲精品韩国| 在线亚洲人成| 亚洲成人二区| 亚州精品视频| 精品色999| 欧美三区不卡| 欧美专区18| 日韩精品视频在线看| 久久久久久网| 国产精品毛片视频| 国产精品一区二区中文字幕| 日本va欧美va精品| 日本国产欧美| 欧美偷窥清纯综合图区| 国产精品密蕾丝视频下载| 国产精品天堂蜜av在线播放| 国产亚洲精品自拍| 国产一区二区三区黄网站| 欧美日韩亚洲一区在线观看| 久久国产精品美女| 婷婷综合电影| 亚洲毛片在线| 男人的天堂久久精品| 成人在线网站| 91精品韩国| 日韩中文在线电影| 欧美亚洲tv| 国产精品第一国产精品| 欧美日本二区| 久久精品99国产精品日本| 日韩国产成人精品| 成人亚洲一区| 日韩高清一区| 欧美日韩国产一区二区在线观看| 91亚洲无吗| 国产探花一区在线观看| 精品视频在线一区二区在线| 久久久久97| 日韩高清三区| 日韩激情啪啪| 日本免费一区二区三区四区| 精品高清久久| 亚洲国产不卡| 久久国产婷婷国产香蕉| 久久av免费看| 日韩国产欧美一区二区| 亚洲女人av| 久久中文精品| 欧美网站在线| 午夜久久久久| 91福利精品在线观看| 国产福利电影在线播放| 99视频在线精品国自产拍免费观看| 福利视频一区| 国产精品伦理久久久久久| 免费视频久久| 91精品国产乱码久久久久久久| av资源亚洲| 黑人精品一区| 91精品婷婷色在线观看| 国产精品一区二区av交换 | 男人操女人的视频在线观看欧美| 午夜精品成人av| 精品久久福利| 麻豆国产精品视频| 日韩网站中文字幕| 午夜欧美理论片| 丝袜亚洲精品中文字幕一区| 精品三级久久久| 久久精品亚洲人成影院| 亚洲精品系列| 日本不卡免费高清视频在线| 亚洲精选成人| 亚洲免费观看高清完整版在线观| 国产在线|日韩| av免费不卡国产观看| 韩国久久久久久| 在线日韩视频| 首页亚洲欧美制服丝腿| 欧美日韩黄网站| 精品久久中文| 久久精品97| 香蕉久久久久久久av网站| 视频在线观看国产精品| 国产成人调教视频在线观看| 男女男精品视频网| 日韩中文av| 国产精品最新| 青草综合视频| 热三久草你在线| 中文无码日韩欧| 精品在线99| 欧美激情日韩|