2016-10-07 3 views
0

私は言葉遣いこのタイトルを間違っているかもしれませんが、JavaScriptでそれがない場合は、なぜ、そうのようなネストされた関数を呼び出すことがOKであるとどのようないくつかより安全またはより適切な方法適切な関数呼び出しのエチケット?

function foo() { 
return function poo() { 
console.log("ew"); 
} 
} 

var fooPoo = foo()(); 

答えて

1

はい、それは素晴らしい、とかなり普通ですにfooのプライベートな情報にアクセスし、その情報にアクセスできるようにするには、呼び出しコードにアクセスしないようにします。たとえ個人情報が不要であっても、foopoo関数を作成する方法を知っている場合でも。

それはあなたが別の関数から関数を返すとき、通常は、あなたの周りの機能を維持したいので、一つの式でそれをすべて行うことは稀比較的です:だけ比較的...

var p = foo(); 
var fp1 = p(); 
var fp2 = p(); 

珍しいことではありません。

ここでは関数の元の呼び出しのコンテキストが保有する個人情報の使用例です(allocatorを、ここでは、あなたのfooのようなものです):

function allocator(seed) { 
 
    return function() { 
 
     return seed++; 
 
    }; 
 
} 
 

 
var a = allocator(1); 
 
console.log(a()); // 1 
 
console.log(a()); // 2 
 
console.log(a()); // 3

。なお、コードaを呼び出すとseedを直接操作することはできません。それはaを呼び出して、それが返す値を使用するだけです。

+0

私の知るところでは、ほとんどが理にかなっていますが、なぜあなたはそれを守りたいのですか? –

+0

@NicholasRotondo:それは機能が何であるかに完全に依存します。 –

0

はい、これはcurryingと呼ばれる機能的手法です。それはあなたのコード内の別の場所で関数のパラメータを設定することができます

function foo(param1) { 
    return function poo(param2) { 
    console.log(param1, param2); 
    } 
} 

var fooPoo = foo('param1')('param2'); 

私は一般的なものは、関数の大きい再利用を可能にするために、イベントリスナーを実行するときに設定を渡すために使用カリー化である

function setColor(color) { 
    return function (e) { 
    e.target.background = color 
    } 
} 

someElement.addEventLister('click', setColor('red')) 

ここではイベントリスナーを宣言するときに設定を渡すことができますが、イベントが発生するまで呼び出されず、クロージャによってイベントリスナーコールバック内のcolor変数にアクセスできます。しかし、今私はそれをかなり使っているテクニックを知っています。

関連する問題