当我在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)
时的函数调用过程是什么?
list()
中,它会调用boundSlice([1, 2, 3], 0)
。但是boundSlice
发生了什么?boundSlice
是call()
Function.prototype
函数的绑定函数,this
值设置为slice()
Array.prototype
函数1}}。slice()
是this
,那么如何生成结果[1, 2, 3]
?我猜最后的电话是[1, 2, 3].slice(0)
,我是对的?如果我是对的,怎么会发生这种情况,任何人都可以向我解释内心的过程吗?答案 0 :(得分: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)
未被修改时。{/ p>
您对[1, 2, 3].slice(0)
list
的结果的假设是正确的。
请注意,function list() {
return Array.prototype.slice.call(arguments);
//or return [].slice.call(arguments);
}
可以简单地实现为:
{{1}}