function H() {
}
H.prototype.K = function() {
console.log(Array.prototype.slice.call(arguments, 1)); //gives [20, 30, 40]
console.log(Array.prototype.slice(arguments, 1)); //gives []
}
H.prototype.K(10, 20, 30, 40)
为什么直接调用slice会给出空数组?如果我可以直接调用函数K,为什么我不能直接调用slice?
答案 0 :(得分:2)
Array.prototype.slice(arguments, 1)
似乎在.slice()
Array.prototype
请参阅Array.prototype.slice(),Function.prototype.call()
arr.slice([begin[, end]])
参数
开始
开始提取的从零开始的索引。作为负面指数, begin表示从序列末尾开始的偏移量。切片(-2) 提取序列中的最后两个元素。如果省略begin, 切片从索引0开始。
console.log(Array.prototype); // `[]`
console.log(Array.prototype.slice()); // `[]`
console.log(Array.prototype.slice([10, 20, 30, 40], 1)); // `[]`
console.log(Array.prototype.slice.call([10, 20, 30, 40] , 1)); // `[20, 30, 40]`
console.log([].slice([10, 20, 30, 40], 1)); // `[]`
console.log([].slice.call([10, 20, 30, 40] , 1)); // `[20, 30, 40]`

答案 1 :(得分:1)
当您直接调用该函数时,它会获得不同的上下文。当作为方法调用时,上下文是arguments
数组,但是当您直接调用它时,上下文将是Array.prototype
对象。
第二次调用不会尝试从arguments
数组中获取项目,它将尝试使用{{从Array.prototype
数组(充当空数组)获取项目1}}作为第一个索引,arguments
作为长度。