我对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);正在立即执行
请帮我摆脱这个问题。
答案 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);