2011-11-06 98 views
1

我剛剛準備好讓NodeJs與我的手粗糙,但在第一個示例上嘗試並播放一些內容時,發現了一些我正在查找的行爲很難明白。setTimeout如何在Node.JS上工作,請解釋此代碼片段

var a = function() { 
    console.log('print 3'); 
    return 5000; 
    }; 

setTimeout(function(){ 
    console.log('print 2'); 
    }, a() 
); 

console.log('print 1'); 

輸出到上面的代碼是:

 
print 3 
print 1 
print 2 

和愚蠢的疑問是,雖然上面的代碼工作,這一個沒有。

setTimeout(function(){ 
    console.log('print 2'); 
    }, (function() {console.log('print 3'); return 5000;}) 
); 
console.log('print 1'); 

請解釋上述行爲。

回答

3

更好地格式化代碼應該可以幫助您瞭解正在發生的事情。

var a = function() { 
    console.log('print 3'); 
    return 5000; 
}; 

setTimeout(function(){ 
    console.log('print 2'); # Executed after 5000 ms. 
    }, 
a());     # Executed first and returns 5000 

console.log('print 1'); #Executed second 

以下代碼段不起作用,因爲您從不執行函數的第二部分。

setTimeout(function(){ 
    console.log('print 2'); 
    }, (function() {   # Never executed. 
    console.log('print 3'); 
    return 5000; 
    }) 
); 

console.log('print 1'); 

下面的工作:

setTimeout(function(){ 
    console.log('print 2'); 
    }, (function() {    
    console.log('print 3'); 
    return 5000; 
    })();      #The brackets() will execute the function. 
); 

console.log('print 1'); 

順便

的例子有無關的Node.js和將產生在迴應任何瀏覽器同樣的結果控制檯。

+0

感謝Gazler,這麼漂亮的解釋。 –

1

setTimeout需要兩個參數(至少,它使用它的方式)。

第一個參數是要調用的函數,第二個參數是調用它之前的延遲時間。

在第一個示例中,您傳遞了一個匿名函數和一個Number(返回值爲a())。

在你的第二個例子中,你傳遞了兩個匿名函數(因爲你永遠不會調用第二個函數(沒有()))。

setTimeout( 
    function(){ 
     console.log('print 2'); 
    }, 
    (function() {console.log('print 3'); return 5000;})() 
); 
console.log('print 1'); 
+0

感謝昆汀,這麼漂亮的解釋 –

1

你需要調用第二個參數 - setTimeout的需要數字

setTimeout(function(){ 
    console.log('print 2'); 
    }, (function() {console.log('print 3'); return 5000;})() 
); 
console.log('print 1');