0

以下代码(来自 msdn)是“绑定”函数的简单实现:

/* 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 的第一次调用?我知道参数不是数组,在使用 slice 和 concat 之前需要将其转换为数组。我不明白第一个电话 - 我们不是在打电话时失去了第一个元素

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

2 回答 2

0

你是对的。

argumentsis的第零个元素thisArg,这就是它被删除的原因。

于 2013-07-21T06:32:28.573 回答
0

根据关于 的文档bind,第一个参数 ( arguments[0]) 是自定义this值,用作由(“绑定函数”)this返回的函数内的值。bind

除了在调用时提供的参数之外,后面的( arguments[1]- arguments[n]) 是调用绑定函数时要附加的参数。

第一个Array.prototype.slice.call所做的是将传递给bindcall 的参数切片,并从传递的第二个参数开始将参数放在前面,留下第一个参数,即我们的this.

例如

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

第一个Array.prototype.slice.call需要foo,barbaz

在返回的函数中,调用绑定函数时提供的参数前面加上foo,bar和get :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'];
于 2013-07-21T06:33:57.987 回答