2017-09-14 13 views
1

これはeloquentjavascriptのコードです:f.apply(ヌル、引数)とf(引数)

function transparentWrapping(f) { 
    return function() { 
    return f.apply(null, arguments); 
    }; 
} 

は、これは私のコードです。私はapplyメソッドを使用していません:

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(arguments); 
    }; 
} 

2つの違いは何ですか?

変更、それはF(引数)とnull.f(引数)との差と言うことができるかどうかの角度、。

+1

違いが分かりますか?あなたの質問が何であるかを明確にするだけです – Rowland

+1

[正確に.applyは何ですか?](https://stackoverflow.com/questions/13317526/what-exactly-does-apply-do)の可能な複製 –

答えて

1

適用()メソッドは、指定されたこの値と関数を呼び出し、指定された引数配列として。 参照:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

したがって、最初の関数は、指定された引数で後で実行できる関数を返します。例については :

function add(x, y){ return x + y } 
var functionX = transparentWrapping(add); 
functionX(1, 2) // this will output 3 

そして、あなたの第二の機能はすぐに配列のようなオブジェクト(引数)としてそれに与えたパラメータで渡された関数を呼び出します。前の例では、fはf([1, 2])のように呼び出されます。これは、xが[1,2]であり、yが未定義であることを意味します。独自の実装では(X + Y = [オブジェクトの引数]未定義)

function add(x, y){ return x + y } 
var functionY = myTransparentWrapping(add); 
functionY(1, 2) // will return [object Arguments]undefined 
0

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(arguments); 
    }; 
} 

もしf関数へのパラメータとしてargumentsを渡します。しかし、argumentsは配列のようなオブジェクト(MDN: Arguments object)です。実際に必要なのは、スプレッド演算子(MDN: Spread syntax)を代わりに使用することです。したがって、あなたの実装は次のようなものになるはずです:

function myTransparentWrapping(f) { 
    return function() {//don't use apply 
    return f(...arguments); 
    }; 
}