簡體   English   中英

在for循環中從函數的返回值分配的變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM