2017-01-20 87 views
0

我很困惑setTimeout方法與JS一起工作的方式。 爲什麼當我調用firstFunction時,setTimeout只運行一次,當我調用第二個函數時,它一直調用該函數。setTimeout JS繼續運行

我期望一致性。第一個函數setTimeout將繼續調用第二個函數中的日誌函數OR,setTimeout只會調用第二個函數並結束。

var firstFunction = function(){ 
    var log = console.log('hello') 
    setTimeout(log, 2000); 
} 

firstFunction(); 

var secondFunction = function(str){ 
    console.log(str) 
    setTimeout("secondFunction('test')", 2000); 
} 

secondFunction('test'); 
+2

因爲'secondFunction'調用'secondFunction'在setTimeout的 - 但'firstFunction'調用函數'log'(無論是)在setTimeout –

+0

超時只是 - *超時*。他們不會無限期地運行(直到你清除他們),他們運行**一次**。在第二個例子中,超時調用函數本身,它模擬* interval *('setInterval')的效果並無限期調用。 – Li357

+0

同樣在你的第一個例子中,'console.log'不會返回任何東西,所以你的超時設置不正確 – Li357

回答

2

第一個片段不正確。 console.log('hello')立即運行,並且超時不會觸發任何事情,因爲在您的示例中logundefined

這裏是一個工作示例會是什麼樣子:

var firstFunction = function(){ 
 
    var log = function() { console.log('hello'); }; 
 
    setTimeout(log, 2000); 
 
} 
 

 
firstFunction();

第二片斷循環永遠,因爲你告訴它做到以下幾點:

1)運行聲明secondFunction('test')

2)記錄參數並設置超時2秒。

3)一旦在超時結束時,運行該語句secondFunction('test')

4)登錄的參數和設定的超時2秒。

5)一旦超時結束,運行該語句secondFunction('test')

...

N)不斷重複的

var secondFunction = function(str){ 
 
    console.log(str) 
 
    setTimeout("secondFunction('test')", 2000); 
 
} 
 

 
secondFunction('test');

請注意,在第一個例子,超時不會再次調用firstFunction,它會調用一個名爲的函數和log不會創建另一個超時回調,因此它只運行一次。

**編輯 - 如何調用它不使用字符串作爲函數參數? **

此外,它可能不是更可取的字符串調用此。使用對函數的引用來調用它。這在第一個例子中演示,其中函數log被聲明並傳入setTimeout。但你也可以這樣來做:

var thirdFunction = function(){ 
 
    setTimeout(function() { console.log('Hello World'); }, 1000); 
 
} 
 

 
thirdFunction();

+0

我明白了。欣賞那....還有什麼辦法我可以編碼,所以我不需要把函數放在一個字符串? –

+0

請參閱更新以回答問題,示例1和3演示如何不使用字符串來調用它。 – GantTheWanderer

+0

我很好奇,如果你可以請解釋調用它使用一個字符串和調用它使用函數的引用之間的區別 –