我对 javascript 中的 setTimeout 函数有疑问。当我们调用 setTimeout 函数而不返回任何内容时,这对我来说没问题。就像
setTimeout(function() {
console.log("ok function called")
},2000);
在上面的示例中,它只是在 2000 毫秒后调用该函数,
如果我这样写
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);
在这个唯一的返回函数中,调用延迟为 2000 毫秒,行 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 的是什么。您传递的是函数的返回值,而不是函数本身。
关于javascript - setTimeout 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50247035/