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

时间:2015-08-22 00:35:05

标签: javascript prototype call slice

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?

2 个答案:

答案 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作为长度。