2017-08-12 39 views
5

我正在查看React源代碼,並偶然發現了一個要求var emptyFunction = require('fbjs/lib/emptyFunction');makeEmptyFunction在fbjs中有什麼用途?

我看着這個功能,被它的功能搞糊塗了。

下面是函數

function makeEmptyFunction<T>(arg: T): (...args: Array<any>) => T { 
    return function() { 
    return arg; 
    }; 
} 

const emptyFunction: (...args: Array<any>) => void = function() {}; 

在評論,他們給我被混淆瞭如下解釋:

該函數接受並丟棄輸入;它沒有副作用。 這主要是有用的慣用的重寫功能 端點總是需要被調用,因爲JS缺少空撥打 成語ALA可可

我從來沒有碰到過空呼成語並希望有人能澄清這意味着什麼,並用較少的技術語言解釋此功能的目的。

希望這個問題不會被忽視,因爲它不完全是代碼相關的。也許它屬於別的地方,如果是的話,我很抱歉。

回答

4

在JavaScript中進行編程時,我們可以將函數作爲某個操作的參數。作爲一個例子,一個函數可能有一個在某種事件之後調用的回調函數。現在

function doIt(callback) { 
    // some work 
    callback(); 
    // more work 
} 

如果這callback是一個可選的參數,它不提供,我們將得到Uncaught TypeError: callback is not a function錯誤,因爲回調是不確定的。這個問題有兩種解決方案。顯而易見的是用if語句檢查callback。如果未分配,另一個選項是將空函數設置爲默認值callback。如果我們有多個地方調用callback函數,這種方法非常有用並且非常有用。所以我們在調用它之前不需要每次檢查它都未定義。

function doIt(callback) { 
    callback = callback || function(){}; 
    // some work 
    callback(); 
    // more work 
} 

同樣,有很多用例我們可以有可重寫的函數變量。將這些類型的變量設置爲空函數作爲默認值是一種常見模式,以便我們可以調用它們而不必擔心這些變量是否被分配/覆蓋。

此外,在某些特殊情況下,具有除返回特定值之外什麼也不做的函數是有用的。 makeEmptyFunction用於創建這樣的功能。基本上,它返回一個函數,它什麼都不做,但返回參數傳遞給它的東西。

emptyFunction.thatReturnsFalse = makeEmptyFunction(false); 

正如你可以在文件中看到,上面的代碼生成一個空函數返回false值。

「null call idiom」是我們在Objective-C/Cocoa編程中找到的東西。它基本上允許你call a method of an uninitialized object(空指針),沒有像大多數其他語言一樣給出任何錯誤。我認爲這就是作者在評論中試圖解釋的。

由於JavaScript沒有這樣的語言功能,我們使用空函數明確實現它。有些人稱它爲no-op或noop,你也可以在其他流行的JavaScript庫中找到類似的助手,例如JQueryAngularJS