2016-11-20 14 views
0

私はHeadfirst Javascriptの本からこのコードを得ました。私は関数名をもっと明確にするように変更しました。私はこれについて私の頭を包み込みようとしている。この関数を値として理解しようとしています

私は番号を使って関数outerに割り当てを割り当てました。その数値は何らかの理由で残っています - n = num(追加された値を返します)のインナーへの参照を返します

アウトナンバーnの値を変更するといつでもインナーはその新しい値を使用しますか? 私は正しいと思いますその。どこにでもあり、私はより良い例を参照してください?それについての詳細を読むことができますか?それとも誰もこれより良いを説明することができますか?

function outer(n) { 
 
\t var inner = function(x) { //or x = 0 
 
    \t return n + (x || 0); //added default 0 for testing to prevent NaN 
 
    } 
 
    return inner; 
 
} 
 
var num = 2; 
 
var add = outer(num); 
 
console.log(`Adding 2 to num(${num}): ${add(2)}`); 
 

 
add = outer(5); 
 
console.log(add()); 
 
console.log(add(2));

+0

あなたの**実際**質問は何ですか? **あなたの**本当の**質問を再定義して、もう一度やり直してください。同様に、あなたは例になっています**欠陥 - ** add2()の機能はありません – Xatenev

+1

あなたが探している言葉は*部分的なアプリケーション*と*カリング*です。これらの用語を使用すると、オンラインで説明を見つけることができるはずです。 – UnholySheep

答えて

1

JavaScriptでは、関数は通常のデータとして動作できます。数値や文字列を渡すというアイデアがあれば、関数を渡すことも同じです。これにより、あなたは非常にクールで強力なことを行うことができます。

addの代わりに、単に数値答えを与える関数ではなく、あなたの数値が埋め込まれた関数を返します。これは、addが実際に何も追加していないことを意味します。addは、関数を作成する関数です(クラスベースのプログラミングでは「ファクトリ」の考え方に似ています)。

名を変更すると、物事を簡単にすることがあります。

function createAddFunction(numberThatWillBeHardWiredIntoReturnedFunction) { 
    var resultingFunction= function(x) { //or x = 0 
    return numberThatWillBeHardWiredIntoReturnedFunction + (x || 0); 
    } 
    return resultingFunction; 
} 
var num = 2; 

// This will cause add to be a function that is hard-wired to add 2 to another number 
var add = createAddFunction(num); 
console.log(`Adding 2 to num(${num}): ${add(2)}`); 

// This will cause add to be a function that is hard-wired to add 5 to another number 
add = createAddFunction(5); 
console.log(add()); 
console.log(add(2)); 
+0

名前は全く違いがあります。この本では、それは単なる挑戦でした。私が打ち込んだとき、それは意味をなさないようになった。だから私は外/内に関数の名前を変更しました。また、ここでいくつかのアドバイスを得て、私はカレーを読んでいます。私はあなたの答えが好きです! –

1

のは、それをさらに明確にするための関数の名前を変更してみましょう。外側の関数が取りますパラメータを使用して新しい関数を作成します。関数は将来の使用のために返されます。

function createFunctionThatAdds(n){ 
 
    var adds_n = function(x) { return n + (x || 0); }; 
 
    return adds_n; 
 
} 
 

 
var adds_2 = createFunctionThatAdds(2); 
 
var adds_5 = createFunctionThatAdds(5); 
 

 
console.log(adds_2(10)); 
 
console.log(adds_5(10));

+0

したがって、この「テクニック」は関数を作成します。それについての言葉はありますか(私はそれについて読むことができます)? –

+0

本当に 'テクニック 'なんて、' add2() 'と' add5() 'とプラス演算を2回定義しなければならないので、**冗長**コードを防ぐための関数を返すだけです。 – Xatenev

+1

@TinklePooplebotthamこれは役立つかもしれないhttp://stackoverflow.com/q/111102/4475267 – noisypixy

1

用いる技術がcurrying呼ばれます。それは機能的なjavascriptの一部です。

詳しくはhereをご覧ください。

その背後にある考え方は、関数を使用して別の関数を生成することができるということです。これをコードでさらに使用することができます。

closureのためにカリングが可能です。

このプリンシペに基づいて構築されたライブラリの多くは、たとえばRamdaです。

関連する問題