2

当我在 MDN 中阅读 Array.prototype.slice 时,我找到了一个示例:类似数组的对象:

这是示例代码:

var unboundSlice = Array.prototype.slice;
var boundSlice = Function.prototype.call.bind(unboundSlice);

function list() {
  return boundSlice(arguments, 0);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

调用时的函数调用过程是什么list(1, 2, 3)

  1. 我知道在list(),它调用boundSlice([1, 2, 3], 0)。但是发生了boundSlice什么?
  2. 我知道这boundSlice是 的函数的绑定函数call()Function.prototypethis值设置为 的slice()函数Array.prototype
  3. slice()是的this,那么如何产生结果[1, 2, 3]呢?我想最后的电话是[1, 2, 3].slice(0),对吗?如果我是对的,怎么会发生这种情况,有人可以向我解释一下内部过程吗?
4

1 回答 1

2
var boundSlice = Function.prototype.call.bind(unboundSlice);

这基本上是:

var boundSlice = function (thisArg, arg1) {
    unboundSlice.call(thisArg, arg1);
};

棘手的部分是它如何知道执行call操作unboundSlice?那是因为该call方法在this内部使用该值来知道要调用哪个函数,并且我们通过使用它this来设置该值会调用该方法。unboundSlice...call.bind(unboundSlice)

例如,当我们这样做时Array.prototype.slice.call(arguments, 0)this里面的值call将是Array.prototype.slice,因为该值始终是未更改时this的左侧。.

你对存在的结果的假设是正确list(1, 2, 3)[1, 2, 3].slice(0)

请注意,list可以简单地实现为:

function list() {
    return Array.prototype.slice.call(arguments);
    //or return [].slice.call(arguments);
}
于 2013-09-29T04:46:04.613 回答