在fbjs中,makeEmptyFunction有什么作用?

7

我在查看React源代码时发现了一个需要使用var emptyFunction = require('fbjs/lib/emptyFunction');的要求。

我查看了这个函数,对它的作用感到困惑。

下面是这个函数:

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

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

在评论中,他们提供了以下解释,我对此感到困惑:
此函数接受并丢弃输入;它没有副作用。这主要用于习惯性地覆盖可调用的函数端点,因为JS缺少类似Cocoa的空调用习惯用法。
我从未遇到过null call idiom,并希望有人能澄清这是什么意思,并用不那么技术化的语言解释这个函数的目的。
希望这个问题不会被看作不相关的问题。也许它应该属于其他地方,如果是这样我很抱歉。
1个回答

6

在JavaScript编程中,我们可以将一个函数作为某个操作的参数。例如,一个函数可能具有一个回调函数,在一些事件之后被调用。

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

如果这个回调函数是可选参数并且没有提供,那么我们将会得到“Uncaught TypeError: callback is not a function”的错误,因为回调函数未定义。有两种解决方法。显然的一种是使用一个if语句检查回调函数。另外一个选项是将空函数设置为callback的默认值,如果它未被分配。如果我们有多个地方调用回调函数,这种方法非常有用,并且效果非常好。因此,在调用它之前,我们不需要每次都检查它是否未定义。
function doIt(callback) {
  callback = callback || function(){};
  // some work
  callback();
  // more work
}

同样,有很多使用情况需要我们能够覆盖函数变量。通常的模式是将这些类型的变量设置为空函数作为默认值,以便我们可以调用它们而不必担心它们是否已分配/覆盖。
此外,在某些特殊情况下,有时候需要一些什么都不做但返回特定值的函数。`makeEmptyFunction` 用于创建这样的函数。基本上,它返回一个函数,该函数什么也不做,只返回传递给它的参数。
emptyFunction.thatReturnsFalse = makeEmptyFunction(false);

正如您在文件中所看到的,上述代码生成一个返回 false 值的空函数。
"null call idiom" 是我们在Objective-C/Cocoa编程中发现的内容。它基本上允许您调用未初始化对象(null指针)的方法,而不像大多数其他语言那样产生任何错误。我认为这就是作者试图在评论中解释的内容。
由于JavaScript没有这种语言特性,我们使用空函数明确地实现它。有些人称其为无操作或noop,您也可以在其他流行的JavaScript库中找到类似的帮助程序,例如JQuery和AngularJS。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接