2016-03-31 14 views
1

私はjsを初めて使い、applyがここでどのように使用されているかを理解しようとしています(遅くともapplyを理解しようと苦労しています)。しかし、私の問題は二重です。私はmergesortの概要を理解していますが、最後のブロックで何が起こっているのか分かりません。merchortを理解するのに役立つことがあります。

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

ここで 'merge'はありますか?それが吐き出すものを見ることなく、説明するのは難しいです。それはスプライスシグ、間違いなく、どのように? – dandavis

答えて

0

applyほとんどcallと同じです。

callを理解している場合、applyはちょうどcallですが、2番目の引数は引数の配列です。たとえば、これらは同じです:

function.call(object, arg1, arg2, ...) 
function.apply(object, [arg1, arg2, ...]) 

最後のブロックでわからないことはわかりません。しかし、私はこの部分であると仮定しますitems.splice.apply(items, params);

ここは故障です。 jsでは、関数は単なるオブジェクトです。また、オブジェクトには関数(または多くの他のオブジェクト指向言語のようにインスタンスメソッド)を持たせることができます。

items.spliceを実行するときは、itemsにアクセスしてから、splice関数をオブジェクトとして取り出してください。次に、applyを使用して呼び出します。 applyの最初の引数は、あなたが呼び出したオブジェクトです。あなたの例では、かっこ内のitemsは、splice関数を呼び出すものです。paramsは、引数の配列です。

1

この場合、スプライスを呼び出すときに、のパラメータの値がが引数として使用されます。 3人のメンバーが言った場合、コールは次のようになります。

items.splice(params[0], params[1], params[2]); 

が、それはそこにあること、したがって、コールがどのように見えるか、を引数として渡すことができます適用されますどのように多くのメンバー、事前に知られていないので、配列。そのコールが効果的である

items.splice.apply(items, params); 

:今、あなたはどのように多くがいることを知っている必要はありません

items.splice(params[0], params[1], params[2], ..., params[n]); 

このの設定を可能にし、それ以来する必要があります適用されますアイテムの場合、最初の引数として渡されます。

関連する問題