makeEmptyFunction 在 fbjs 中的作用是什么?

What purpose does makeEmptyFunction serve in fbjs?

我在浏览 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() {};

在评论中,他们给出了以下解释,让我感到困惑:

This function accepts and discards inputs; it has no side effects. This is primarily useful idiomatically for overridable function endpoints which always need to be callable, since JS lacks a null-call idiom ala Cocoa

我从来没有遇到过 null call 惯用语,希望有人能用不太专业的语言澄清这意味着什么并解释这个函数的目的。

希望这个问题不会被轻视,因为它与代码不完全相关。也许它属于其他地方,如果是这样我很抱歉。

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

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

现在,如果这个 callback 是一个可选参数并且没有提供,我们将得到 Uncaught TypeError: callback is not a function 错误,因为回调未定义。这个问题有两种解决方案。显而易见的是使用 if 语句检查 callback。如果未分配,另一个选项是将空函数设置为默认值 callback。如果我们有多个地方调用 callback 函数,这种方法非常有用并且会发光。这样我们就不需要每次调用前都检查它是否为undefined。

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

同样,在很多用例中我们可以拥有可覆盖的函数变量。将这些类型的变量设置为空函数作为默认值是一种常见的模式,这样我们就可以调用它们而不必担心它们是否是assigned/overridden。

此外,在某些特殊情况下,让函数只 return 一个特定值是很有用的。 makeEmptyFunction 用于创建此类函数。基本上,它 return 是一个函数,除了 return 传递给它的参数之外什么都不做。

emptyFunction.thatReturnsFalse = makeEmptyFunction(false);

如您在文件中所见,上面的代码生成了一个空函数,其中 returns false 值。

"null call idiom" 是我们在 Objective-C/Cocoa 编程中发现的东西。它基本上允许您 call a method of an uninitialized object (空指针)而不会像大多数其他语言那样给出任何错误。我认为这就是作者在评论中试图解释的内容。

由于JavaScript没有这样的语言特性,我们明确地使用空函数来实现它。有些人称之为 no-op 或 noop,您也可以在其他流行的 JavaScript 库中找到类似的帮助程序,例如 JQuery and AngularJS