用于可选回调的JavaScript样式

hen*_*ald 88 javascript coding-style callback

我有一些函数偶尔(并不总是)会收到回调并运行它.检查回调是否定义/功能是一种好的风格还是有更好的方法?

例:

function save (callback){
   .....do stuff......
   if(typeof callback !== 'undefined'){
     callback();
   };
};
Run Code Online (Sandbox Code Playgroud)

Ray*_*nos 133

我个人更喜欢

typeof callback === 'function' && callback();

typeof然而,该命令是狡猾的,应该只用于"undefined""function"

问题typeof !== undefined是用户可能传入已定义的值而不是函数

  • 顺便说一下,使用"&&"非常惯用. (4认同)
  • `typeof`不是狡猾的.它有时很模糊,但我不会称之为狡猾.但同意,如果你打算将回调称为函数,最好检查它实际上是一个函数,而不是,你知道,一个数字.:-) (3认同)
  • `typeof` 不会导致拳击。`typeof "foo"` 是 `"string"`,而不是 `"object"`。它实际上是您可以判断您是在处理字符串原语还是 `String` 对象的唯一真实方法。(也许您正在考虑`Object.prototype.toString`,它[非常方便](http://blog.niftysnippets.org/2010/09/say-what.html),但确实会导致拳击。) (2认同)

Pab*_*dez 46

你也可以这样做:

var noop = function(){}; // do nothing.

function save (callback){
   callback = callback || noop;
   .....do stuff......
};
Run Code Online (Sandbox Code Playgroud)

如果您碰巧callback在几个地方使用它,它特别有用.

另外,如果你正在使用jQuery,你已经拥有了这样的功能,它被称为$ .noop

  • 在我看来,这是最优雅的解决方案. (3认同)
  • 但这不解决类型问题不是吗?如果我传递一个数组怎么办?还是一个字符串? (3认同)
  • 同意.这也使测试更容易,因为没有条件. (2认同)

nin*_*123 36

简单地做

if (callback) callback();
Run Code Online (Sandbox Code Playgroud)

如果提供回调,我更喜欢调用回调,无论它是什么类型.不要让它无声地失败,因此实现者知道他传递了一个不正确的参数并且可以修复它.


Luc*_*cio 8

ECMAScript 6

// @param callback Default value is a noop fn.
function save(callback = ()=>{}) {
   // do stuff...
   callback();
}
Run Code Online (Sandbox Code Playgroud)