首先我們介紹一下window.settimeout這個方法,該方法設定乙個定時器,該定時器在定時器到期後執行乙個函式或指定的一段**。其語法如下:
settimeout
function是在到期時間(delay毫秒)之後執行的函式。
delay是延遲的毫秒數 (一秒等於1000毫秒),函式的呼叫會在該延遲之後發生。如果省略該引數,delay取預設值0,意味著「馬上」執行,或者盡快執行。不管是哪種情況,實際的延遲時間可能會比期待的(delay毫秒數) 值長。
接下來,我們來看一下下面這段**,
let
我們直觀的理解就是,for迴圈每一步都會呼叫一次settimeout,但是我們設定的delay是0毫秒,那麼每次列印出來的應該是當前的i的值。可是,其輸出是這樣的
列印出來6個6,也就是,每乙個的settimeout中的函式都是在for迴圈結束之後執行的,可是我們設定的delay時間的0毫秒啊,應該立即執行啊。
這裡的原因就是前面delay這個引數介紹中的「實際的延遲時間可能會比期待的時間長」造成的。我們可以這樣想,for迴圈需要的時間為t1,第乙個被執行的settimeout的實際延遲時間為t2,如果t2大於t1,那麼第乙個settimeout中的函式就會在for迴圈執行完之後被執行,這時候console.log接受到的i已經是for迴圈結束之後的6,所以第乙個settimeout列印出了6,後面同理。
那麼怎樣修改這段**讓它列印出012345呢。
我們只需要做一點點修改:
for
其結果為
for迴圈中使用let宣告,就能實現列印012345,我們可以認為是for迴圈的每一步都為當前的**塊建立了乙個區域性變數i,當settimeout中的函式執行的時候就是呼叫的這個區域性變數i,因此可以實現列印012345。
js立即執行函式
void function func function param function param param function function function 這些可能在平時寫一些普通指令碼的時候不會用,也不常見,但是當你看別人的原始碼的時候就會發現,特別是一些js的外掛程式時候,是很常見的,初...
js 立即執行函式
先來兩種常見的格式吧 function 形參列表 實參列表 function 形參列表 實參列表 以上兩種都是常見的立即執行函式的形式。那麼,這樣寫的原因是什麼?我們只能這麼去寫嘛?原因是有的,當然也還有別的寫法 立即執行函式其實有這樣的規則 函式表示式 這個括號叫做執行符號。函式宣告包括函式定義和...
js 立即執行函式
立即執行函式其實就是函式的呼叫。形如 function function 要理解函式表示式 函式宣告 以及匿名函式 函式宣告function funname 函式表示式var funname function 呼叫函式的方式都為funname 需要用函式名進行呼叫。匿名函式 function 是沒有...