我是js的新手,我试图了解apply
在这里的使用方式(我最近一直在努力理解apply
) 。但是,我的问题是双重。虽然我理解mergesort的概述,但我不知道最后一个块中发生了什么。
function mergeSort(items){
if (items.length < 2) {
return items;
}
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle),
params = merge(mergeSort(left), mergeSort(right));
// Add the arguments to replace everything between 0 and last item in the array
params.unshift(0, items.length);
items.splice.apply(items, params);
return items;
}
答案 0 :(得分:1)
在这种情况下, params 中的值将在调用 splice 时用作参数。如果有3个成员,那么电话会是:
items.splice(params[0], params[1], params[2]);
但由于之前不知道会有多少成员,因此调用应该是什么样子, apply 允许将参数作为数组传递。现在你不需要知道有多少:
items.splice.apply(items, params);
所以电话有效:
items.splice(params[0], params[1], params[2], ..., params[n]);
apply 也允许设置 this ,因为它应该是 items ,所以它作为第一个参数传递。< / p>
答案 1 :(得分:0)
apply
与call
几乎相同。
如果您理解call
,apply
只是call
,但第二个参数是一个参数数组。例如,这些是相同的:
function.call(object, arg1, arg2, ...)
function.apply(object, [arg1, arg2, ...])
我不确定你在最后一个街区中不明白的是什么。但我认为这部分是items.splice.apply(items, params);
这是一个细分。在js中,函数只是对象。对象可以有函数(或实例方法,就像许多其他OO语言一样)。
执行items.splice
后,您所做的只是进入items
,然后将splice
功能拉出(作为对象)。然后使用apply
来调用它。 apply
的第一个参数是您调用的对象。在您的示例中,括号中的items
是调用splice
函数的函数,params
是一个参数数组。