setTimeout如何工作?

时间:2018-05-09 06:43:09

标签: javascript node.js

我对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(“传递值为”+ params);正在立即执行

请帮我摆脱这个问题。

3 个答案:

答案 0 :(得分:2)

一个是功能。另一个是函数调用。

首先,让我们暂时忘记javascript。如果你知道任何其他编程语言,你期望下面的两段代码做什么?

x

您期望1是什么? a或指向函数y的指针?

您期望1是什么? a或指向函数setTimeout(function() {console.log("ok function called")}, 2000); 的指针?

函数不是函数调用。当你调用一个函数时,它会返回一个值。

现在让我们切换回javascript。每当我对一段代码感到困惑时,我会尝试使语法更简单,以便我能理解正在发生的事情:

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

现在,这是一段紧凑的代码,让我们的语法更简单。上面的代码与:

相同
a

那是做什么的?它将在2秒后调用函数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);

可以进一步简化为:

{{1}}

所以我希望你能看到你真正传递给setTimeout的东西。您正在传递函数的返回值,而不是函数。

答案 1 :(得分:0)

写作时

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结尾的实际参数会被延迟调用。这就是你上一个例子中的情况。

答案 2 :(得分:0)

setTimeout只接受没有括号的函数名 正确的语法:setTimeout(Helloworld) - 这里设置功能
语法不正确:setTimeout(HelloWorld()) - 这里是调用函​​数

或非IIFE功能。 这是你正在传递的IIFE,因此它会被立即调用。 setTimeout(function(params){return something;}(55),2000);