2016-01-22 34 views
0

我是新來的JavaScript和AngularJS,以及網絡的發展,而我正在經歷的Angular docs on directives,我碰到這段代碼傳來:在javascript中將函數放入其他空函數的目的是什麼?

// start the UI update process; save the timeoutId for canceling 
timeoutId = $interval(function() { 
    updateTime(); // update DOM 
}, 1000); 

爲什麼不能這只是這樣寫方式:

// start the UI update process; save the timeoutId for canceling 
timeoutId = $interval(updateTime(), 1000); 

這不就是它的回調函數嗎?它仍然是一個函數中的一個函數。在一個函數中有一個函數...在函數中有什麼意義?

+0

你可能意思是'$ interval(updateTime,1000)',它是當前'updateTime'的方式立即被調用,而不是在1秒之後 –

+0

@AndrewWhitaker我不知道有什麼區別,謝謝! – pv93

回答

1

因爲該函數將被立即調用並且返回的值將被指定爲間隔的回調。

但是,函數引用可以作爲回調函數傳遞,該函數將在指定的時間間隔後調用。

timeoutId = $interval(updateTime, 1000); 
           ^: Removed() 
1

如果你有這樣的功能:

timeoutId = $interval(function() { 
    updateTime(); 
}, 1000); 

有沒有很多實際的差別與調用

timeoutId = $interval(updateTime, 1000); // Notice NO parens after "updateTime"! 

從技術上講,第一個版本調用什麼也不做,但功能調用另一個函數,這意味着微不足道的額外開銷,並不值得擔心。

你可能會這樣做的一個原因是代碼可讀性:它可以更容易地「看到」第一個版本將回調作爲第一個參數傳遞給$ interval(),因爲它被寫爲函數。代碼的運行速度並沒有太大的差別,但如果您或其他人需要閱讀並理解將來會發生什麼,它會爲您節省一些開發時間。

+0

這樣做的其他原因我能想到的是,如果您有多個語句,即使您想在開發過程中添加'$ log.debug(something)',也需要額外的包裝函數。如果你嘗試使用'$ interval(some_object.updateTime,1000)',那麼這個Javascript陷阱就會變成'this',這與你使用更長的變體時不一樣。 – Duncan

相關問題