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