需要帮助了解mergeSort和apply()

时间:2016-03-31 05:37:50

标签: javascript apply

我是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;
}

2 个答案:

答案 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)

applycall几乎相同。

如果您理解callapply只是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是一个参数数组。