вторник, 30 июля 2013 г.

Объясните, для чего предназначена и каким образом работает следующая функция:

Объясните, для чего предназначена и каким образом работает следующая функция:

function bind(method, context) {
      var args = Array.prototype.slice.call(arguments, 2);
      return function() {
            var a = args.concat(
                               Array.prototype.slice.call(arguments, 0));
            return method.apply(context, a);
      }
}

Решение.

 // Функция bind предназначена для связывания метода с объектом, для того, чтобы этот метод можно было вызвать применительно к данному объекту.
function bind(method, context) { // Функция bind принимает 2 аргумента: method - функция или метод, какого-либо объекта и context - объект для которого быдет вызвана данная функция или метод.
      var args = Array.prototype.slice.call(arguments, 2); // Поскольку функция bind может принимать более двух аргументов, то мы вырезаем помещаем все аргументы, идущие после аргументов method и context в отдельный массив args. Поскольку arguments не являются обычным массивом и потому не имеет метода slice, то мы заимствуем метод slice из Array.prototype.
      return function() { // Функция bind возвращает безымянную (анонимную) функцию, которая в случае своего вызова выполнит вызов переданной функции method применительно к переданному объекту context.
            var a = args.concat(Array.prototype.slice.call(arguments, 0)); // Полученный ранее массив аргументов, идущих после method и context мы объединяем со всем массивом аргументов, переданных в возвращаемую безымянную функцию, если они вдруг будут переданы. Поскольку arguments не являются обычным массивом, то мы опять заимствуем метод slice из Array.prototype.
            return method.apply(context, a); // Безымянная функция при своем вызове возвратит результат от выполнения переданной в качестве аргумента функции method, вызванной применительно к переданному объекту context. При вызове функции method в нее будут переданы полученные ранее аргументы в формате массива args, поскольку используется метод apply.
      }
}

Комментариев нет:

Отправить комментарий