使用数组原型切片调用

时间:2013-07-21 06:27:34

标签: javascript

以下代码(来自msdn)是'bind'函数的简单实现:

/* 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)?

2 个答案:

答案 0 :(得分:0)

你是对的。

arguments的第0个元素是thisArg,这就是它被移除的原因。

答案 1 :(得分:0)

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

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

第一个Array.prototype.slice.call做的是对传递给bind调用的参数进行切片,并从传递的第二个参数开始获取要添加的参数,留下第一个参数,即this 1}}。

例如

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

第一个Array.prototype.slice.call需要foobarbaz

在返回的函数中,foobarbaz会在调用绑定函数时提供给参数:

//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'];