PROGRAMMING
javascript
- ページャーを作る(簡易版)
- ページャーを作る 4/4
(クロスブラウザ対策)
(ページャー表示用メソッド)
(ページャーの使い方) - ページャーを作る 3/4
(イベント登録) - ページャーを作る 2/4
(スタイルの設定) - ページャーを作る 1/4
(ページャー用関数を準備)
(各要素を生成) - 自作カレンダーを作る 6/6
(11.~14.各種メソッド)
(15.簡単な使い方) - 自作カレンダーを作る 5/6
(09.祝休日の判定)
(10.閏年の判定) - 自作カレンダーを作る 4/6
(08.イベントの設定) - 自作カレンダーを作る 3/6
(07.スタイルの設定) - 自作カレンダーを作る 2/6
(05.カレンダーのマスのみ作成)
(06.各マスへ年月・日付を埋め込み) - 自作カレンダーを作る 1/6
(01.カレンダーの基を準備)
(02.各月の日数や年月日の区切り文字)
(03.前月・次月指定時の処理)
(04.前月・次月部分の年月を算出) - JS-Image-Resizerを使って画像を高画質で縮小
- ファイルを作成しローカルに保存
- モーダルウィンドウをクラス化
- ストップウォッチを作る
- XMLHttpRequest Lebel2を試してみる
- jQuery:Tableで親・子・兄弟要素を取得
- 文字列をセパレータ文字で分割し配列で返す関数
- forループのカウンタを使用している関数の定義
- クロージャの使いどころ
- JSONPでクロスドメイン
- AjaxでJSON形式のデータを扱う
- jsファイルからjsファイルを呼び出す
- jQuery:モーダルウィンドウを作ってみる
CSS
- フォルダ構成をCSSで見やすくする
- シンタックスハイライトPrismのカスタマイズ
- リスト(li)を中央に配置する
- ブロックレベル要素全体をリンクにする
- 実践と点線の交わり部分のギザギザをすっきりさせる
PHP
Java
- IntelliJ.Gradle.JavaFX(6) プラグイン org.beryx.jlink を使ってみる
- IntelliJ.Gradle.JavaFX(5) NSISでインストーラーを作る
- IntelliJ.Gradle.JavaFX(4) exewrapで実行可能jarをexe化する
- IntelliJ.Gradle.JavaFX(3) Jlink でカスタム JRE を作る
- IntelliJ.Gradle.JavaFX(2) すべての依存対象を含んだ Fatjar を作る
- IntelliJ.Gradle.JavaFX(1) アプリケーションを作る
- javaのコンパイルと実行
- イメージを回転する
- Exif情報を簡単に取得できるライブラリ
- 高画質で画像縮小
- JDBCによるデータベース操作
クロージャの使いどころ
理解に苦しんだクロージャですが、クロージャの定義みたいなもの?は解ったような気がします。
ただ、そのクロージャをどんな時に使うのかというところが未だピンと来ていません。
その辺のところを考えて見ます。
マニュアル本や、いろいろなサイトで見かけるクロージャのサンプル
次の例は、マニュアル本や、いろいろなサイトで紹介されているクロージャの例です。
function closure(num){
var counter = num;
return function (){
counter++;
document.write(counter + "<br>");
};
}
var func1 = closure(0);
var func2 = closure(100);
func1(); // counterの値=1
func2(); // counterの値=101
func2(); // counterの値=102
func2(); // counterの値=103
func1(); // counterの値=2
func1(); // counterの値=3
関数を呼び出す(実行)する度にインクリメントされた数字を返すというもので、
このサンプルを見てクロージャとはこういうものかと理解しました。
1. 関数の中に関数
2. 外側の関数の戻り値として内側の関数を返している
3. 内側の関数から外側の関数のローカル変数を参照している
4. 参照している変数の値を保持している
この中でメリットと思われるのは「4.参照している変数の値を保持している」ではないでしょうか。
何故変数の値を保持できるのか
closure関数は10行目で実行されています。
ローカル変数counterはclosure関数の終了とともに破棄されるはずです。
ところが、サンプルではclosure関数が代入された、func1・func2が実行された結果を見ても判るとおり、
ローカル変数counterの値は保持されています。
これは Activation Object によるものでした。10行目では次のようなことが行われています。
1. func1の宣言でグローバルオブジェクトにプロパティfunc1が定義された
2. closure関数実行でclosure関数のActivationオブジェクトが自動生成される
3. closure関数のActivationオブジェクトにプロパティcounterが定義される
4. closure関数の戻り値である匿名関数の実行で匿名関数のActivationオブジェクトが生成される
5. スコープチェーンが形成された
匿名関数のオブジェクト→closure関数のオブジェクト→グローバルオブジェクト
通常はclosure関数の終了とともにローカル変数は破棄されます。
ところがfunc1に代入された匿名関数がclosure関数のActivationオブジェクトのプロパティcounterを参照しているため破棄されずに残ることになります。
同じことが11行目でも行われ、func1、func2でそれぞれ別のオブジェクト・スコープチェーンを生成しているため、
自身のスコープチェーンの内のcounterの値を返すことになります。
使いどころ
データの保持の仕組みは解りましたが、どのような使い方をするのがもっとも効果的なのでしょうか?
データ保持の仕組みは他にもいろいろありますし、クロージャはメモリリークの問題があるとの記事もたくさん見ました。
自分ではどうにも思いつかず、「クロージャ メリット」「クロージャ 使いどころ」とググッてみましたが、
これといったものは見つけられませんでした。残念。