关于绑定和混乱的困惑用JavaScript调用

时间:2013-09-29 04:30:10

标签: javascript call bind slice

当我在MDN中读取Array.prototype.slice时,我找到了一个例子:Array-like objects:

以下是示例代码:

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. 我了解boundSlicecall() Function.prototype函数的绑定函数,this值设置为slice() Array.prototype函数1}}。
  3. slice()this,那么如何生成结果[1, 2, 3]?我猜最后的电话是[1, 2, 3].slice(0),我是对的?如果我是对的,怎么会发生这种情况,任何人都可以向我解释内心的过程吗?

1 个答案:

答案 0 :(得分:2)

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

这基本上是:

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

棘手的部分是如何知道在call上执行unboundSlice操作?这是因为call方法在内部使用this值来知道要调用的函数,因为我们通过使用thisunboundSlice值设置为...call.bind(unboundSlice)这种方法。

例如,当我们执行Array.prototype.slice.call(arguments, 0)时,this内的call值将为Array.prototype.slice,因为this值始终是.的左侧list(1, 2, 3)未被修改时。{/ p>

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

请注意,function list() { return Array.prototype.slice.call(arguments); //or return [].slice.call(arguments); } 可以简单地实现为:

{{1}}