为什么这一段javascript给出了不同的结果?

Why does this piece of javascript gives different results?

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?

Array.prototype.slice(arguments, 1) 似乎在 Array.prototype

上呼叫 .slice()

Array.prototype.slice() , Function.prototype.call()

arr.slice([begin[, end]])

Parameters

begin

Zero-based index at which to begin extraction. As a negative index, begin indicates an offset from the end of the sequence. slice(-2) extracts the last two elements in the sequence. If begin is omitted, slice begins from index 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]`

当您直接调用该函数时,它会获得不同的上下文。当作为方法调用时,上下文是 arguments 数组,但当您直接调用它时,上下文将是 Array.prototype 对象。

第二次调用不会尝试从 arguments 数组中获取项目,它将尝试从 Array.prototype 数组(充当空数组)中获取项目,使用 arguments 作为第一个索引,1 作为长度。