目的closures
は単に状態を保持することです。したがって、名前closure
-それは状態を閉じます。説明を簡単にするために、Javascriptを使用します。
通常、機能があります
function sayHello(){
var txt="Hello";
return txt;
}
ここで、変数のスコープはこの関数にバインドされています。そのため、実行後に変数txt
はスコープ外になります。関数の実行が終了した後にアクセスしたり使用したりする方法はありません。
クロージャーは言語構造であり、前述のように、変数の状態を保持し、スコープを延長できます。
これは、さまざまな場合に役立ちます。1つの使用例は、高次関数の構築です。
数学およびコンピュータサイエンスでは、高次関数は、(また、機能的形態、機能的またはファンクタ)以下の少なくとも一つを行う機能である:1
- 入力として1つ以上の関数を取ります
- 関数を出力します
簡単ですが、確かにあまり有用ではない例は次のとおりです。
makeadder=function(a){
return function(b){
return a+b;
}
}
add5=makeadder(5);
console.log(add5(10));
関数を定義しますmakedadder
。これは、入力として1つのパラメーターを取り、関数を返します。あり、外側の関数function(a){}
と内側の function(b){}{}
あなたは(暗黙的に)別の関数を定義.Further add5
高次の目的球を呼び出した結果としてはmakeadder
。makeadder(5)
匿名(内部)関数を返します。この関数は1つのパラメーターを取り、外部関数のパラメーターと内部関数のパラメーターの合計を返します。
秘 The は、実際の追加を行う内部関数を返す間、外部関数(a
)のパラメーターのスコープが保持されることです。パラメータがであることをadd5
思い出します。a
5
または、少なくとも何らかの形で有用な例を示します:
makeTag=function(openTag, closeTag){
return function(content){
return openTag +content +closeTag;
}
}
table=makeTag("<table>","</table>")
tr=makeTag("<tr>", "</tr>");
td=makeTag("<td>","</td>");
console.log(table(tr(td("I am a Row"))));
別の一般的なユースケースは、いわゆるIIFE =即時に呼び出される関数式です。JavaScriptでは、プライベートメンバー変数を偽造することは非常に一般的です。これは、定義を呼び出した直後にプライベートスコープ= を作成する関数を介して行われclosure
ます。構造はfunction(){}()
です。()
定義の後の括弧に注意してください。これにより、モジュールパターンを明らかにしながらオブジェクト作成に使用することができます。秘Theは、スコープを作成し、IIFEの実行後にこのスコープにアクセスできるオブジェクトを返すことです。
Addiの例は次のようになります。
var myRevealingModule = (function () {
var privateVar = "Ben Cherry",
publicVar = "Hey there!";
function privateFunction() {
console.log( "Name:" + privateVar );
}
function publicSetName( strName ) {
privateVar = strName;
}
function publicGetName() {
privateFunction();
}
// Reveal public pointers to
// private functions and properties
return {
setName: publicSetName,
greeting: publicVar,
getName: publicGetName
};
})();
myRevealingModule.setName( "Paul Kinlan" );
返されたオブジェクトには関数への参照(例publicSetName
)があり、その関数は「プライベート」変数にアクセスできますprivateVar
。
しかし、これらはJavascriptのより特別な使用例です。
プログラマーが実行する特定のタスクのうち、クロージャーが最も役立つと思われるタスクはどれですか?
その理由はいくつかあります。彼は機能的なパラダイムに従うので、彼にとっては自然なことかもしれません。または、Javascriptの場合:クロージャーに頼って言語のいくつかの癖を回避する必要はありません。