關於閉包問題的多種方法

2021-07-30 16:16:50 字數 1275 閱讀 5204

這是一篇關於閉包的文章,看完感觸很深。儘管很多人都可以知道閉包的結果會帶來什麼但是卻很少人深究為什麼。

for (var i = 0; i < 5; i++) , 1000);

}console.log(new

date, i);

結果是5,5,5,5,5,5。

第乙個5是最後乙個輸出語句的,由於迴圈執行很快,所以還沒等settimeout到時間就執行完畢了。

其次的5是迴圈語句裡面的。但是它們的先後順序又是如何呢?

答案是幾乎同步。

上面說了,for迴圈執行起來速度很快,加上所有定時器的時間都是1秒,所以幾乎是同步完成的輸出。

但,為什麼都是5呢?

因為在該語句裡,i是按引用傳遞的,所以當i為5時才執行settimeout,當然輸出為5了。

很多人一定都可以給出下面的答案

for(var i = 0; i < 5; i++) 

}(i), 1000);

}

意料之中,輸出為0,1,2,3,4。

有沒有別的寫法呢?肯定有

for(let i = 0; i < 5; i++) , 1000);

}

發現不同了嗎?

僅僅需要把var->let就可以實現同樣功能。由於let的特性,i會只存在於for這個作用域中。

for(var i = 0; i

< 5; i++) , 1000, i);

}

var output = function

(i), 1000);

}for(var i = 0; i

< 5; i++)

函式的引數是按值傳遞的。因此傳入的i非引用。

for(var i = 0; i < 5; i++) 

}(i), 1000*i);

}

很聰明的答案,只需要等待下標秒數即可。

其他的答案,更好的?

promise

const task = ;

for(var i = 0; i < 5; i++)

}(i), 1000*i);

}));

}promise.all

(task).then

(()=>, 1000);

});

關於閉包問題二

我在整理閉包問題的時候,看到一道前端面試題 for var i 0 i 10 i 0 了解 js 的非同步機制的都知道,輸出結果是 10 10 10 10 然後面試官又問 如果希望得到的是0 1 2 9,如何能夠解決這個問題 我腦海想到的第乙個解決方法就是用let代替var使for形成塊級作用域 第...

關於setTimeout函式中的閉包問題

今天看到這麼一道題 function dog msg this.work function var o new dog bones o.work 返回結果是undefined下面我來解釋一下結果為什麼是undefined,為什麼沒有輸出預期的 bones 這是因為在執行完o.work 這行 時,th...

關於js的閉包

要理解上面的問題,首先要理解清楚幾個概念 來自 閉包裡的微觀世界 區別就是值型別變數是可以直接訪問棧 stack 中的值 接下來的內容就是關於閉包的微觀世界 function a return b var c a 函式a執行後返回函式b,並將函式b賦給c c 輸出 1 本來這個地方變數i是定義在函式...