2015-07-31 5 views
3

у меня есть:Функция становится неопределенной, когда вернулся

  • словарь (functions) отображение строк префиксы к функциям
  • функции (get()), которая возвращает функцию, отображенную на строку
  • функции (check()), который проверяет, есть ли функция, сопоставленная с строкой, вызывая get() и отбрасывая ее на логическое значение с !!.

Когда я называю get() с ключом в functions, я ожидаю, что check() возвращает true; однако он возвращает false. Я выполняю поиск словаря в get() и печатаю тип результата в обеих функциях. Вот странная часть. Тип function только в get(); в check(), это undefined. По-видимому, функция стирается или что-то, когда я возвращаю ее. Как я могу сделать check() точным?

Вот мой упрощенный код:

var someObject = { 
    functions: { 
     "a": function() { return 0; }, 
     "b": function() { return 1; } 
    }, 
    get: (function (someVariable) { 
     Object.keys(this.functions).forEach((function (functionKey) { 
      if (someVariable.startsWith(functionKey)) { 
       console.log(typeof this.functions[ functionKey ]); 
       return this.functions[ functionKey]; 
      } 
     }).bind(this)); 
    }), 
    check: function (stringToCheck) { 
     var returnedFunction = this.get(stringToCheck); 
     console.log(typeof returnedFunction); 
     return !!returnedFunction; 
    } 
} 

$(document).ready(function() { 
    someObject.check("a"); 
}); 

Выполнение этого кода производит это:

"function" 
"undefined" 

в консоли.

ответ

2

Это потому, что forEach не ломается рано/короткое замыкание на return заявление (оно продолжается со следующей итерации, а затем функция возвращает getundefined). Вы можете переписать цикл, чтобы разрешить нарушение (скажем, простым for-loop), или вы могли бы вернуть значение после цикла, например:

1

Это потому, что вы возвращаете функцию из обратного вызова forEach. это никуда не годится.

Исправление может работать, как Джек предложил, но код код можно упростить:

get: function (someVariable) { 
     var func; 
     Object.keys(this.functions).some(function (functionKey) { 
      if (someVariable.startsWith(functionKey)) { 
       console.log(typeof this.functions[ functionKey ]); 
       func = this.functions[ functionKey]; 
       return true; 
      } 
     }, this); 
     return func; 
    } 
  • Вам не нужно обернуть функцию с
  • скобок
  • Вам не нужно связывать, forEach & some (тот, который я использовал) принимает параметр thisArg.
  • Если вы используете some, итерация прекращается, как только обратный вызов возвращает true. Это более эффективно в случаях, когда есть много ключей, а также более точно соответствует тому, что пытался сделать ваш оригинальный код. В версии Джека, если ключи, где ['a', 'b', 'aa'], вы перебираете все 3 и возвращаете «aa», а ваш код (и мой) останавливается после первого «a».
Смежные вопросы