function highest(){
return makeArray(arguments).sort(function(a,b){
return b - a;
});
}
function makeArray(array){
return Array().slice.call( array );
}
assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value.");
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results.");
这个例子来自John Resig的Learning Advanced JavaScript#45。 http://ejohn.org/apps/learn/#45
以下是一些我很感激帮助的问题。提前谢谢。
1)。当function highest()
返回makeArray(arguments)
时,function makeArray
会在sort
的{{1}}函数之前发生吗?这样在makeArray()运行之后,剩下的部分
function highest
函数最高的继续,并且从makeArray返回的数组进行排序?
2)在函数makeArray(数组)中,究竟什么是“call”调用?
3)在函数makeArray中,是否使用了切片,因为调用分别采用其参数而不是数组?
4)在最后的断言中,[1]是否代表4> 1的数组中的位置。即排序后有一个数组['5','4','3','3','2','1']
答案 0 :(得分:3)
是的,这是完全正确的。这些行动按顺序发生。
它正在调用Array.prototype.slice
并传递array
arguments
highest
对象slice
。在没有参数的情况下调用时,arguments
只返回它正在处理的对象的副本。这就是我们将类似数组的slice
对象转换为实际数组的方法。
见#2。 call
和arguments
串联使用可生成highest
的实际数组副本。
是的,再次,你是对的。 {{1}}函数返回一个数组,其中包含按降序排序的参数。
答案 1 :(得分:2)
在我回答这个问题时,又发布了另一个答案。但我认为问题中显示的大多数混淆都归结为一个关键点。
在JavaScript中,函数和方法是对象。哪些可能有属性等。当您说Array.slice
时,您会获得slice
方法。当您说Array.slice()
时,您现在正在调用 slice
方法。因此Array.slice.call
访问call
对象上slice
方法的Array
属性。 (该属性本身就是一种方法。)Array.slice.call( stuff )
调用 。
这是一个很容易错过的语言的基本事实。但如果你不明白这一点,你会发现使用它的代码几乎不可能真正理解。