幕后发生的事情是当.slice()
通常被调用,this
是一个数组,然后它只是迭代该数组,并完成其工作。
How is this
in the .slice()
函数数组?因为当你这样做时:
object.method();
...the object
自动变为的值this
in the method()
。所以:
[1,2,3].slice()
...the [1,2,3]
数组被设置为值this
in .slice()
.
但是如果你可以用其他东西代替呢?this
价值?只要你替换的内容有数字.length
属性,以及一堆数字索引的属性,它应该可以工作。这种类型的对象通常称为类似数组的对象.
The .call()
and .apply()
方法让你manually设置值this
在一个函数中。所以如果我们设置的值this
in .slice()
to an 类似数组的对象, .slice()
只会assume它正在使用一个数组,并且会做它的事情。
以这个普通对象为例。
var my_object = {
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three',
'4': 'four',
length: 5
};
这显然不是一个数组,但是如果你可以将它设置为this
的价值.slice()
,那么它就会起作用,因为它看起来足够像一个数组.slice()
才能正常工作。
var sliced = Array.prototype.slice.call( my_object, 3 );
Example: http://jsfiddle.net/wSvkv/ http://jsfiddle.net/wSvkv/
正如你在控制台中看到的,结果正是我们所期望的:
['three','four'];
这就是当您设置arguments
对象作为this
的价值.slice()
。因为arguments
has a .length
属性和一堆数字索引,.slice()
就像在真正的数组上一样进行工作。