关于javascript:es6回调的默认值参数

ES6 Default value parameter for callback

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
let myFunc = (callback) => {
  callback = callback || (() => {});
  // do something...
  callback();
}

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

以下任何解决方案都不能满足我的要求:

1如果定义了回调:

1
2
3
  if (typeof callback === 'function') {
    callback();
  }

一点也不紧凑!

2实用功能:

1
2
3
4
5
6
7
8
let safeFunc = (callback) => {
  return callback || (() => {});
};

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

但问题是,在this之间已经发生了变化,这在我的情况下很重要。

3使用call

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

用户不太友好。

4创建ID函数

1
2
3
4
5
6
const ID = () => {};

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

具有外部依赖性,功能不太好,但可能是最佳选择。


这是另一个选择。

5只要一张支票……

1
  if (callback) callback();

如果您想防止调用回调两次,我在这里调用的另一个实用函数callit,它还处理传递参数,如果this对于防止使用bind也很重要,只需传递this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
  }
);


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

1
2
3
4
let myFunc = (callback = Function()) => {
  // do something...
  callback();
}

调用Function()返回noop函数:

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


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

1
2
3
4
5
function(callback=()=>{}) {
    if(typeof callback === 'function') {
        callback();
    }
}