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回调的默认值参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章