[英]Variable assigned from a function's return in a for loop?
讓我們以這個為例:
function test(i, total) {
return total + i * 100 / 999 * -124 / 333;
}
var total = 0;
for (var i = 0; i <= 100; i++) {
total = test(i, total);
console.log(total);
}
測試它時,我發現它是同步工作的-for循環將等待,直到test(i,total)返回其值,然后再進行下一次迭代。
但是,在其他情況下,甚至在某個函數完成其功能之前,循環仍會繼續進行甚至結束。 如果測試函數花了3秒鍾返回,循環為什么要等待呢? 是因為測試功能中沒有異步性質嗎? 我嘗試在測試函數中將setTimeout設置為3秒,然后從控制台日志中得到未定義的信息。
函數調用是同步的,並且在Javascript中是單線程的。 這是根據語言設計。 當您從循環中調用test
函數時,循環將等待直到函數返回。
調用setTimeout
,它將創建一個計時器並立即返回。 它不等待計時器被觸發(即使是第一次)。 計時器異步觸發。
有關更多信息,請參見JavaScript是否保證是單線程的? 並了解網絡工作者 。
“如果測試函數花了3秒鍾返回,循環為什么要等待呢?是因為測試函數中沒有異步特性嗎?”
究竟。 與幾乎所有其他語言一樣,功能在Javascript中是同步執行的。 執行是沿着單個路徑完成的,因此,當您調用函數時,它將在返回之前完成,並且調用之后的代碼可以繼續。
如果在函數中使用異步代碼(例如setTimeout
),則異步代碼將被擱置,直到其余代碼執行完畢,瀏覽器將控件歸還為止,因為Javascript是單線程的。
如果您在循環中調用test
101次,並且每次都使用setTimeout
,那么在循環完成時將有101條代碼等待運行。 在循環完成之前,這101條代碼無法運行。 您暫停的代碼無法提供從函數返回的值,因為函數可以在代碼運行之前返回。
要異步運行代碼,可以使用函數完成后調用的回調。 例:
function test(i, callback) {
window.setTimeout(function(){
var result = i * 100 / 999 * -124 / 333;
callback(result);
}, 1000);
}
var total = 0;
var resultCount = 0;
for (var i = 0; i <= 100; i++) {
test(i, handleCallback);
}
function handleCallback(value) {
total += value;
resultCount++;
if (resultCount == 101) {
console.log(total);
}
}
演示: http : //jsfiddle.net/7VgWV/
這是因為JavaScript是單線程的。 您的代碼是單線程的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.