1. 需求:我們現在需要寫一個 foo 函數,這個函數返迴首次調用時的 Date 對象,註意是首次。 使用場景:當我們每次都需要進行條件判斷,其實只需要判斷一次,接下來的使用方式都不會發生改變的時候,想想是否可以考慮使用惰性函數。 惰性函數:顧名思義,有點懶惰,懶到事件只處理一次,當然不是值整個函數 ...
1. 需求:我們現在需要寫一個 foo 函數,這個函數返迴首次調用時的 Date 對象,註意是首次。
使用場景:當我們每次都需要進行條件判斷,其實只需要判斷一次,接下來的使用方式都不會發生改變的時候,想想是否可以考慮使用惰性函數。
惰性函數:顧名思義,有點懶惰,懶到事件只處理一次,當然不是值整個函數只處理一次。而是裡面的某一行或者多行只執行一次。正常情況下,一個函數內部,所有的該執行的東西,無論是定義變數,還是新建對象,亦或者做判斷,還是運算,定義定時器等等,都是依照順序來執行,無論這個函數執行調用多少次,都依舊是如此;
簡單理解下,惰性函數的本質就是函數重寫,所謂惰性載入,指函數執行的分支只會發生一次。
為了不影響全局變數,我們用閉包簡單來做:
function foo() { if (foo.t) return foo.t; foo.t = new Date(); return foo.t; }
但是每次執行都需要進行一次判斷,為瞭解決每次都需要判斷的情況,使用惰性函數,
var foo = function() { var t = new Date(); foo = function() { return t; } console.log(foo, 'foo'); console.log(foo(), 'foo()'); return foo() } console.log(foo()); setTimeout( () => { console.log(foo()); }, 3000)
最後發現兩次列印一摸一樣,因為第一次執行立即執行函數的時候,沒有跳過var t = new Date();這一步,並且把一個新的函數返回給了foo,第二次執行的時候,foo函數只會執行:立即執行函數中的那個新的函數,也就跳過了var t = new Date();直接使用第一次調用的t的值。