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