[JavaScript General] Closure(クロージャ)
用語の整理。
[markdown]
## MDN
> * [クロージャ – JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures)
### クロージャ
– クロージャは、独立した (自由な) 変数を参照する関数です。言い換えると __クロージャ内で定義された関数は、自身が作成された環境を ‘覚えています’。__
– __クロージャは関数とその関数が作られた環境という 2 つのものが一体となった特殊なオブジェクトです。__ この環境は、クロージャが作られた時点でスコープ内部にあったあらゆる変数によって構成されています。
### 実用的なクロージャ
– クロージャを使うと、データ (環境) をそれを操作する関数と結びつける事が出来ます。 __メソッドを 1 つだけ持つオブジェクトを使いたくなるような状況ならば、どんな時でもクロージャを使う事ができます。__
### クロージャでプライベートメソッドを模倣する
– __プライベートメソッドはコードへのアクセスを制限するのに役立つだけではなく、__ コードのパブリックインターフェースが不要なメソッドでいっぱいになるのを防ぐため、 __グローバル名前空間を管理するのに非常に有効です。__
– __モジュールパターン__ としても知られる、クロージャを使って、プライベートな関数と変数にアクセスできるパブリック関数を定義するにはこのようにします。
> * [Learning JavaScript Design Patterns](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript)
> * [【JavaScript】デザインパターンを知ってみる。モジュール・パターン編 | バシャログ。](http://bashalog.c-brains.jp/14/03/24-171000.php)
> * [【JavaScript】モジュールパターンについて知る – Qiita](http://qiita.com/KENJU/items/a8a1009f5872a8b12568)
### パフォーマンスへの配慮
– 例えば、新しくオブジェクト/クラスを作成する時、 __一般的にメソッドは__ オブジェクトのコンストラクタの中で定義するのではなく、 __オブジェクトのプロトタイプに結びつけるべきです。__
### 関連
> * [関数と関数スコープ – JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions_and_function_scope)
## 書籍
技術評論社
売り上げランキング: 16,839
– クロージャとは、「ローカル変数を参照している関数内関数」。
“`javascript
function closure(init) {
var counter = init;
return function() {
return ++counter;
}
}
var myClosure = closure(1);
document.writeln(myClosure());
document.writeln(myClosure());
document.writeln(myClosure());
“`
## サイト
> * [JavaScriptでクロージャ入門。関数はすべてクロージャ? – Qiita](http://qiita.com/takeharu/items/4975031faf6f7baf077a)
“`javascript
var module = (() => {
var count = 0;
return {
increment() {
count++;
},
show() {
console.log(count);
}
};
})();
module.show(); // 0
module.increment();
module.show(); // 1
console.log(count); // undefined
“`
> * [[JavaScript] 猿でもわかるクロージャ超入門 まとめ · DQNEO起業日記](http://dqn.sakusakutto.jp/2009/01/javascript_5.html)
>
> クロージャを作ってからクロージャを理解する。 理解するよりも、作る方が簡単。
“`javascript
function outer() {
var x = 1; // outerのスコープ内で変数を定義
return function () { // この関数が「クロージャ」
alert(x); // “関数内関数”の中で、outerスコープの変数を参照。
};
}
var f = outer();
f(); // 1と表示。
“`
> これが何故クロージャなのかというと、次の条件を満たしているからです。
>
> – outerのスコープ内で変数を定義し、
> – outerの中に関数(=関数内関数)を作って
> – その関数内関数から、先ほどの変数を参照する
[/markdown]