【问题标题】:How to properly return an empty function?如何正确返回一个空函数?
【发布时间】:2013-06-06 05:44:37
【问题描述】:

我正在使用函数的运行时分配来解决浏览器的差异。但是对于不受支持的浏览器,我想返回一个空函数,这样就不会抛出 JavaScript 错误。

但是,jslint 抱怨空函数。 jslint 的快乐方式是什么?

空块。

$R.functionNull = function () {
    // events not supported;
};

$R.Constructor.prototype.createEvent = (function () {
    if (doc.createEvent) {
        return function (type) {
            var event = doc.createEvent("HTMLEvents");
            event.initEvent(type, true, false);
            $NS.eachKey(this, function (val) {
                val.dispatchEvent(event);
            });
        };
    }
    if (doc.createEventObject) {
        return function (type) {
            var event = doc.createEventObject();
            event.eventType = type;
            $NS.eachKey(this, function (val) {
                val.fireEvent('on' + type, event);
            });
        };
    }
    return $R.functionNull;
}());

【问题讨论】:

  • JSHint 有一个允许空块的选项,我不认为 jslint 有这个选项。
  • Jslint 喜欢明确且易于阅读的内容,因此我认为它希望您返回 undefined。

标签: javascript jslint


【解决方案1】:

您可以在函数中添加一个主体并让它返回undefined

$R.functionNull = function() {
    // Events not supported.
    return undefined;
};

这与“真空”函数保持相同的语义,并且应该满足 JSLint。

【讨论】:

  • void 0 更容易,它也避免了争论:P
【解决方案2】:

使用 lambda 表达式:

$R.functionNull = () => void 0;

【讨论】:

    【解决方案3】:

    对我来说这是最好的:

    emptyFunction = Function();
    
    console.log(emptyFunction); // logs 'ƒ anonymous() {}'
    console.log(emptyFunction()); // logs 'undefined'
    

    它太短了,我什至不会将它分配给变量(当然你也可以使用类似常量的变量“EF”左右,它更短并且不需要额外的“()”括号)。只需在需要真正空函数的任何地方使用“Function()”,它甚至没有名称,即使将其分配给变量也不行,这就是我的解决方案与 Frédéric 的解决方案之间的微小行为差异:

    // --- Frédéric ---
    
    emptyFunction = function() {
       return undefined;
    }
    
    console.log(emptyFunction.name); // logs '"emptyFunction"'
    
    // --- me ---
    
    emptyFunction = Function();
    
    console.log(emptyFunction.name); // logs '""' (or '"anonymous"' in chrome, to be fair)
    

    【讨论】:

      【解决方案4】:

      返回呢

      return () => undefined;

      而不是

      return $R.functionNull;

      【讨论】:

      • 只是其他人的旁注: () => void 0;正如在 splintor 的回答中看到的那样,它更安全,因为它总是返回 undefined 并且不能被覆盖。我必须以艰难的方式学习...
      猜你喜欢
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2018-04-17
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多