2013-07-29 7 views
2

Я работаю с angularjs и phonegap и перешел этот код, который «знаю», что он делает, но я не знаю, как это работает. Я все еще чувствую себя комфортно с продвинутыми концепциями js, поэтому, если бы вы могли быть немного описательными, я действительно мог бы это оценить.javascript function callback

Вопросы:

  1. При регистрации обратного вызова, я не вижу следующие переменные, установленные в любом месте: аргументы (строки 5) и Fn (строка 10). Объявлены ли они в прототипе функции?

  2. Является ли блок кода в строках 9 и 15 просто установкой «этого» значения, чтобы в обратном вызове значение «this» указывало на один и тот же объект? Что мы называем этой методикой применения «этого» значения?

 

    myApp.factory('phonegapReady', function() { 
     return function (fn) { 
      var queue = []; 
      var impl = function() { 
       queue.push(Array.prototype.slice.call(arguments));  
      }; 

      document.addEventListener('deviceready', function() { 
       queue.forEach(function (args) { 
        fn.apply(this, args); 
       }); 
       impl = fn; 
      }, false); 

      return function() { 
       return impl.apply(this, arguments); 
      }; 
     }; 
    }); 

 

ответ

4

arguments это переменная, которая всегда доступна внутри функции и представляет собой массив-подобный объект, который содержит все аргументы, переданные функции. Причина Array.prototype.slice.call используется потому, что arguments не является точно массивом (его объектом, который имеет последовательные цифровые клавиши 0, 1 и т. Д.), И этот код является одним из способов превратить его в настоящий массив Java.

fn - это параметр, передаваемый функции в строке 2 и доступный внутренней функции в строках 10 и 12 из-за closures (внутренняя функция имеет доступ ко всем переменным ее внешней функции, даже после внешней функции возвращается).

Насколько apply звонки с this идти, вы правы в том, что он устанавливает, что объект функция вызывается, и тем самым, что объект this будет ссылаться внутри этих функций.

Однако важно отметить, что значение this является динамическим и определяется во время выполнения функции, а не при ее объявлении. Например, в цикле forEachthis относится к глобальному объекту (который может быть предназначен), а не к объекту, который вызвал событие deviceready. В последней строке значение this будет зависеть от того, как вызывается результат полного вызова phonegapReady.