今天在學習的時候遇到了 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