簡體   English   中英

setTimeout如何工作?

[英]How setTimeout works?

我擔心javascript中的setTimeout函數。 當我們調用setTimeout函數而不返回任何內容時,對我來說還可以。 喜歡

setTimeout(function() {
   console.log("ok function called")
},2000); 

在上面的示例中,它只是在2000ms之后簡單地調用該函數,

如果我這樣寫

setTimeout(function(params) {
   console.log("passed value is"+params)
},2000,55);

現在它將以55作為參數調用此函數,對嗎?

但是問題是當我打電話寫這樣的時候

setTimeout(function(params) {
   console.log("passed value is"+params)
}(55),2000);

這里函數以55作為參數調用,但是現在等待2000ms

當我寫像

setTimeout(function(params) {
    console.log("passed value is "+params);
     return function(){
      console.log(params)
     };
 }(55),2000);

在此唯一的返回函數以2000ms延遲調用的情況下,console.log(“ passed value is” + params); 立即執行

請幫助我擺脫這個問題。

一個是功能。 另一個是函數調用。

首先,讓我們暫時忘記javascript。 如果您知道任何其他編程語言,那么您期望下面的兩段代碼做什么?

function a () { return 1 }

x = a;
y = a();

您期望x是什么? 1或函數指針a

您期望y是什么? 1或函數指針a

函數不是函數調用。 調用函數時,它將返回一個值。


現在,讓我們切換回javascript。 每當我對一段代碼感到困惑時,我都會嘗試使語法更簡單,以便我理解發生了什么:

setTimeout(function() {console.log("ok function called")}, 2000);

現在,這是一段緊湊的代碼,讓我們簡化語法。 上面的代碼與:

var a = function() {console.log("ok function called")};
setTimeout(a, 2000);

那怎么辦? 2秒后它將調用函數a

現在讓我們看一下:

setTimeout(function() {console.log("ok function called")}(), 2000);
                                  // Note this ----------^^

等同於:

 var b = function() {console.log("ok function called")}();
 setTimeout(b, 2000);

可以進一步簡化為:

var a = function() {console.log("ok function called")};
var b = a();
setTimeout(b, 2000);

因此,我希望您看到真正傳遞給setTimeout的內容。 您傳遞的是函數的返回值,而不是函數。

當你寫

setTimeout(function (params) { return something; }(55), 2000);

實際發生的情況是這樣的:

var _temp_func = function (params) { return something; };
var _temp = _temp_func(55);
setTimeout(_temp, 2000);

您擁有作為setTimeout參數的匿名函數,即使在調用setTimeout本身之前,也會立即進行評估。 與此相反,在此處以_temp結尾的實際參數被延遲調用。 這就是您上一個示例中發生的情況。

setTimeout僅使用函數名稱,不帶括號。
正確的語法:setTimeout(Helloworld)-在這里設置函數
錯誤的語法:setTimeout(HelloWorld())-在這里調用函數

或非IIFE功能。 您正在通過的是IIFE,因此會立即被調用。 setTimeout(function(params){return something;}(55),2000);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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