Принудительно передать анонимную функцию, которая возвращает объект в качестве параметра в JavaScript - PullRequest
0 голосов
/ 06 января 2012

У меня есть следующий код

1)  var x = {};
    x.data = {name: 'name', lname: 'lname'};
    x.someOtherData = ['blah','blah','irrelevant'];
    aFunction(x);

Таким образом, я называю вышеупомянутую группу утверждений несколько раз, порядок утверждений является важным, конечно. Иногда я забываю сделать последнее утверждение aFunction (x), которое вызвало у меня много головной боли, поэтому я сделал следующее:

2) aFunction(function(){
    var x = {};
    x.data = {name: 'name', lname: 'lname'};
    x.someOtherData = ['blah','blah','irrelevant'];
    return x; 
   }());                     

Что работает, и мне было любопытно, если бы в моем методе функции aFunction был способ принудительно указать, что передаваемый параметр должен быть анонимной функцией. Я возвращаю объект из этой анонимной функции, поэтому следующее, очевидно, не будет работать

3) function aFunction(x) {
    if(x.constructor == Function) {
      alert('yay you're doing it right'); 
    } else { 
     alert('nay, you're doing it wrong'); //this is what happens given that x.constructor == Object
   }
}

Я знаю, что могу сделать следующее, и вышеуказанная проверка будет работать, но я хотел бы заключить всю мою логику в аргумент aFunction в скобках, как в фрагменте кода 2:

4) var z =  function(){
   var x = {};
   x.data = {name: 'name', lname: 'lname'};
   x.someOtherData = ['blah','blah','irrelevant'];
   return x; 
  };
  aFunction(z);  

Есть идеи?

Обновление:

Неважно, я понял это. Я не могу сразу вызвать анонимную функцию, как я это сделал, и вызвать ее в методе Function. Конечно, помогает выписать ваши проблемы при переполнении стека, чтобы проблема и решение были более понятными. Все еще открыто, как другие решают подобные проблемы. Шаблоны проектирования и т.д ..

Решение:

aFunction(function(){
var x = {};
x.data = {name: 'name', lname: 'lname'};
x.someOtherData = ['blah','blah','irrelevant'];
return x; 

});

function aFunction(x) {
if(x.constructor == Function) {
      alert('yay you're doing it right'); 
      x(); //call it here
    } else { 
     alert('nay, you're doing it wrong'); 
   }

}

1 Ответ

2 голосов
/ 06 января 2012

Мне было бы любопытно, если бы в моем методе функции, aFunction был способ принудительно указать, что передаваемый параметр должен быть анонимной функцией.

Но вы не передача анонимной функции.Вы вызываете анонимную функцию и передаете результат.

Вы можете передать функцию (а не результат вызова функции), а затем в aFunction(x) вы протестируете, что x является функциейи затем вызовите его, чтобы получить значение / объект для работы:

function aFunction(x) {
    if(typeof x === "function") {
        var workingValue = x();
    }
}

Но, конечно, это никоим образом не гарантирует, что переданная функция вернет значение в правильном формате.Также это не гарантирует, что это анонимная функция.

Ваш синтаксис номер 2 хорош, как есть, с преимуществом сохранения любых рабочих переменных вне текущей области (при условии, чтоничего не нарушает), но если ваша заявленная цель - убедиться, что вы не забыли позвонить aFunction() в конце вашей другой обработки, ну ... Мое мнение, это простозатрудняет чтение кода для других.

РЕДАКТИРОВАТЬ: только что увидел ваш обновленный вопрос, где вы решили сделать то, что я упомянул выше (кажется, вы обновлялись в то время, когда я отвечал).Серьезно, я на самом деле думаю, что это плохой шаблон проектирования, и я только упомянул его как гипотетическое решение - я не думаю, что сначала дал понять, что на самом деле не рекомендую его.

На мой взгляд, ваша оригинальная версия № 1 - лучший способ, или, если вы должны использовать функцию, ваша версия № 2 в порядке.

...