2013-07-21 5 views
0

Следующий фрагмент кода (из MSDN) является простой реализацией функции «привязки»:Использование массива Prototype фрагмент вызова

/* Approximation of `Function.prototype.bind` from ES5 (without error checking) */ 
Function.prototype.bind = function(thisArg) { 
    var fn = this, args = *Array.prototype.slice.call(arguments, 1)*; 
    return function() { 
    return fn.apply(thisArg, args.concat(*Array.prototype.slice.call(arguments, 0)*)); 
    }; 
}; 

Может кто-нибудь объяснить, первый вызов Array.prototype.slice.call? Я понимаю, что аргументы не являются массивом, и нужно использовать его в массиве перед использованием среза и concat. Я не понимаю первого вызова - не теряем ли мы первый элемент при вызове

Array.prototype.slice.call(arguments, 1)? 

ответ

0

Вы верны.

Нулевой элемент arguments - thisArg, поэтому его снимают.

0

Согласно документации о bind, первый аргумент (arguments[0]) является значением пользовательских this для использования в качестве значения this внутри функции, возвращаемой bind (далее «оценка функции»).

Далее (arguments[1] - arguments[n]) аргументы, которые быть префиксом при вызове функции связанного, в дополнение к аргументам, которые предоставляются при вызове.

Что первый Array.prototype.slice.call делает это нарежьте аргументы, передаваемые bind вызов и получить аргументы, которые будут предваряться начиная со второго аргумента, переданного, оставив позади первого аргумента, который был бы наш this.

Например

var newFN = someFunction.bind(myNewThis,foo,bar,baz); 

Первый Array.prototype.slice.call принимает foo, bar и baz.

В возвращаемой функции, foo, bar и baz получить предваряются с аргументами при вызове связанной функции:

//fn - original function 
//args - extracted arguments foo, bar and baz 
//thisArg - the provided `this` value, myNewThis 

//this code basically: 
// - calls the original function (fn) 
// - provides a custom `this` value (thisArg) 
// - provides arguments that comprise the extracted arguments + the passed arguments 
fn.apply(thisArg, args.concat(Array.prototype.slice.call(arguments, 0))); 

Так что, когда вы используете новую «связанную» функцию, вы получите пользовательское this значение , а также список «пресетов», список препровожденных аргументов:

newFN('ban','bam'); //arguments === ['foo','bar','baz','ban','bam']; 
+0

ОК, который немного разъясняет. Однако почему необходимость concat args с аргументами в fn.apply? Я бы подумал, что как только мы создадим переменную args, мы просто передадим ее для применения. –

+0

@Joel_Blum Я объяснил это в последней части и в коде. – Joseph

Смежные вопросы