【问题标题】:ES6 Default value parameter for callback [duplicate]ES6回调的默认值参数[重复]
【发布时间】:2017-04-14 21:18:13
【问题描述】:

我有几个带有可选回调的函数:

let myFunc = (callback) => {
  callback = callback || (() => {});
  // do something...
  callback();
}

回调默认参数的最佳写法是什么?

以下解决方案都不能让我满意:

1 如果定义了回调:

  if (typeof callback === 'function') {
    callback(); 
  }

一点也不紧凑!

2 实用功能:

let safeFunc = (callback) => {
  return callback || (() => {});
};

let myFunc = (callback) => {
  // do something...
  safeFunc(callback)();
}

但问题是this 之间发生了变化,这对我来说很重要。

3 使用call

let myFunc = (callback) => {
  // do something...
  safeFunc(callback).call(this);
}

对用户不太友好。

4 创建ID函数

const ID = () => {};

let myFunc = (callback=ID) => {
  // do something...
  callback();
}

有外部依赖,不是很实用,但可能是最好的选择。

【问题讨论】:

  • 不一定有“最佳”方式。 1 和 4 是很好的解决方案,但请注意它们不是等效的。如果传入一个不是函数的值,4 会抛出错误,1 不会。
  • 我看不出这个问题是如何与引用的问题重复的。我也不明白为什么答案中有这么多反对票。
  • 我认为 4 的更好方法是 callback = () => void 0。它解析为undefined,我们显式返回,并且留空 { } 会在 eslint 和 jslint 中出现错误。

标签: javascript ecmascript-6


【解决方案1】:

这是另一种选择。

5 只是一个 if 检查..

  if (callback) callback(); 

如果你想防止两次调用回调,我在这里调用了另一个实用函数 callIt,它也处理传递参数,如果this 对防止使用绑定也很重要,只需传递this..

function callIt(that, fn) {
  if (fn) fn.apply(that, Array.prototype.slice.call(arguments,2));
}


//Test Object
function Test() {
  this.test = 'Test';
}

Test.prototype.calltest = function (callback) {
  callIt(this, callback, 1, 2, 3);
}

var t = new Test();
t.calltest(
  function (a,b,c) { 
    console.log('this.test = ', this.test); 
    console.log('args = ', a, b, c);
  }
);

【讨论】:

  • 实际上可以用callback && callback();缩短
  • 没有办法避免重复callback吗?
  • 需要检查参数是否为函数 - if (typeof callback === 'function')
【解决方案2】:

直接调用Function()构造函数看起来很有意义:

let myFunc = (callback = Function()) => {
  // do something...
  callback();
}

调用Function()会返回一个noop函数:

let noopFunc = Function()
noopFunc() // => undefined

【讨论】:

    【解决方案3】:

    // ES6方式:(默认参数)

    function(callback=()=>{}) {
        if(typeof callback === 'function') {
            callback();
        }
    }
    

    【讨论】:

    • 如果你还是使用typeof callback,为什么要有默认值?
    • 我以为我以前试过这个,但显然没有。我接受你的,因为这当然是最自然的。
    • @FelixKling typeof 检查传递的callback 参数是否为函数,而不是默认值是否为函数。
    • @PierreSpring:当然。这不是我的评论所暗示的。我的观点是,如果您已经在验证参数的类型,则无需指定空函数作为默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    相关资源
    最近更新 更多