为什么这一段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
作为长度。
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
作为长度。