それこそがクロージャの真価です。function(){window.alert(text);};})();hello();できました!クロージャの書き方自体はコード3の無名関数を使った例と同じです。function(){window.alert(text);}という内容だけですがこのtextはローカル変数のtextなので一度ifで"Hello"または"こんにちは"が代入された後はずっと同じ値が入っています。クロージャの「関数終了後もローカル変数を参照できる特徴」によって見事グローバル変数を減らすことと、処理を増やさないことを両立したわけです。まとめさて上でもチラッと書いたようにクロージャに関して説明しているページや本は数あれどその多くは1の特徴のみを説明する場合が多く、クロージャの真価でもある1と2の両立が説明されている所があまりないように思います。カウンターの例では「グローバル変数を減らした変わりに計算量が増えてしまった」コード5のパターンが想像しづらいため2の特徴に気づかない、とも言えるかもしれません。私の場合このことがいまいちクロージャの使いどころが分からなかった原因のように感じます。最初に書いた、友人がなんて言って悩んでいる時に「そう言う時はクロージャを使うといいよ」と言ってあげればいいのか。これの答えは「しょっちゅう呼び出す関数なんだけどその処理の内の一部は呼ばれるたびに全く同じことをやるだけなんだよね。いってその一部をグローバルに置くのは困るんだ。うまい方法ない?」という感じになるのではないでしょうか。※念のため断りを入れておきますが上でリンクしているサイトの例が悪いと言っているのではありません。これらは紛れもなく「最も簡単なクロージャの例」であり、何かを説明する時に「最も簡単な例」を使うことは至極当然のことだからです。以上が私なりのクロージャに関する整理でした。読んでいただいた方の理解の一助となればこれほどうれしいことはありません。01:44はじめまして。クロージャーの認識自体はあってると思うんですが、利用用途はもうちょっとあるかな・・・?って気がします。「グローバル変数定義を減らす」はOKだとして、「計算量を減らす」はちょっと極論すぎるかも。ポイントは「クロージャーは引数以外の変数を、定義したその時に設定されたものを利用すると保証できている」ところじゃないですかね。計算量も減らせる(=クロージャー定義時に計算した結果を格納するため)とは思うんですが。ここの例が一番参考になるかもです。非同期通信みたいに実行した時のデータを元に非同期通信のコールバック処理をしてもらいたい場合は使えますね。15:32コメントありがとうございます。ご指摘の通りだと思います。これを書いた当時は広範な用途については私自身が理解できていなかったのと、具体例を重視して書いたので上のような内容になったと思います(^_^;)スパム対策のためのダミーです。Engineで何か作ることです!GAEに関する記述はPythonの使用を前提にしています。他言語使用時は設定などが異なる場合があります。ページビュー649586カテゴリーJavascriptPythonGAEHTML雑記ハードウェアスコアアタックしりとりtilamicjs。