今天在学习的时候遇到了 setTimeout 立即调用的问题,很费解,于是就研究了一下。
这是我原来的代码:
function getAge(value) {
console.log(value)
}
setTimeout(getAge(18), 2000)
后来发现 setTimeout
的第一个参数必须是需要编译的代码或者是一个函数方法,而如果直接传入一行可执行代码,那么抱歉,这里会立即执行,没有延迟效果。
解决办法如下:
(1)让第一个参数成为函数
setTimeout(function () {
getAge(18)
}, 2000)
(2)使用附加参数(一旦定时器到期,它们会作为参数传递给 function)
setTimeout(getAge, 2000, 18)
思考:
有人可能会疑惑,我之前那个 getAge(18) 不是也是函数吗?
其实是这样的:一个函数名后跟一个 ( ) ,表明立即调用函数,所以 setTimeout 就没有延迟效果了。
论证:
setTimeout(
(function () {
getAge(18)
})(),
2000
)
该 setTimeout 也会立即输出,在控制台打印 18