Подтвердить что ты не робот

Стиль JavaScript: необязательные обратные вызовы

У меня есть некоторые функции, которые я захочу иногда запускать обратный вызов, но не всегда, проверяет, определен ли обратный вызов/функция хорошего стиля или есть лучший способ?

Пример:

function save (callback){
.....do stuff......
   if(typeof callback !== 'undefined'){
     callback();
   };
};
4b9b3361

Ответ 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();
};

Обратите внимание, что пользователь может передать что-то еще, кроме функции, и сломает его.