ES6回调的默认值参数[重复]

Posted

技术标签:

【中文标题】ES6回调的默认值参数[重复]【英文标题】:ES6 Default value parameter for callback [duplicate] 【发布时间】: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 中出现错误。 【参考方案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:当然。这不是我的评论所暗示的。我的观点是,如果您已经在验证参数的类型,则无需指定空函数作为默认值。

以上是关于ES6回调的默认值参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ES6 函数参数的默认值

ES6之函数的默认值剩余参数

JavaScript ES6 - 函数扩展

JavaScript ES6 - 函数扩展

ES6学习笔记值函数扩展

ES6学习笔记值函数扩展