繁体   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