Стиль JavaScript: необязательные обратные вызовы
У меня есть некоторые функции, которые я захочу иногда запускать обратный вызов, но не всегда, проверяет, определен ли обратный вызов/функция хорошего стиля или есть лучший способ?
Пример:
function save (callback){
.....do stuff......
if(typeof callback !== 'undefined'){
callback();
};
};
Ответы
Ответ 1
Я лично предпочитаю
typeof callback === 'function' && callback();
Однако команда typeof
является хитростью и должна использоваться только для "undefined"
и "function"
Проблемы с typeof !== undefined
состоят в том, что пользователь может передать значение, которое определено, а не функцию
Ответ 2
Вы также можете сделать:
var noop = function(){}; // do nothing.
function save (callback){
callback = callback || noop;
.....do stuff......
};
Это особенно полезно, если вы используете callback
в нескольких местах.
Кроме того, если вы используете jQuery
, у вас уже есть такая функция, она называется $. noop
Ответ 3
Просто сделайте
if (callback) callback();
Я предпочитаю вызывать обратный вызов, если он предоставлен, независимо от того, какой тип он есть. Не позволяйте ему терпеть неудачу, поэтому разработчик знает, что он прошел в некорректном аргументе и может его исправить.
Ответ 4
Если критерии запуска обратного вызова состоят в том, что он определен или нет, тогда вы в порядке. Кроме того, я предлагаю проверить, действительно ли это функция.
Ответ 5
Мне так надоело видеть этот же фрагмент снова и снова, я написал это:
var cb = function(g) {
if (g) {
var args = Array.prototype.slice.call(arguments);
args.shift();
g.apply(null, args);
}
};
У меня есть сотня функций, которые делают такие вещи, как
cb(callback, { error : null }, [0, 3, 5], true);
или что-то еще...
Я скептически отношусь ко всей стратегии "убедитесь, что она функционирует". Единственными законными значениями являются функция или ложь. Если кто-то передает ненулевое число или непустую строку, что вы собираетесь делать? Как игнорировать проблему решить?
Ответ 6
Я перешел на кофе - script и нашел аргументы по умолчанию - хороший способ решить эту проблему.
doSomething = (arg1, arg2, callback = ()->)->
callback()
Ответ 7
Это можно легко сделать с помощью ArgueJS:
function save (){
arguments = __({callback: [Function]})
.....do stuff......
if(arguments.callback){
callback();
};
};
Ответ 8
Действительная функция основана на прототипе Function, используйте:
if (callback instanceof Function)
чтобы убедиться, что обратный вызов является функцией
Ответ 9
Добавив к тому, что сказал Пабло, на последнем ECMAScript это действительно:
// @param callback Default value is a noop fn.
const wow = (callback = ()=>{}) => {
callback();
};
Обратите внимание, что пользователь может передать что-то еще, кроме функции, и сломает его.