Museumソフトウェアエンジニアのブログ。JavaScript』を読んだシリーズの続き。JavaScript』を読んで(項目4〜7)第2章はスコープとかクロージャとかの話。クロージャを持たない言語で育った自分にとって、この概念を理解するのは大変だった記憶がある。勉強したのだけど、クロージャを使って状態を持つオブジェクト作成するあたりは非常に感心した。大学時代に先生が「クロージャは関数型言語でオブジェクト指向的な機能を実装するために利用できる」と言っていて、当時は理解できなかったのだが今なら理解できる。いうこともあってか、理解した時はプログラマとして自分がひとつ賢くなった気がした。第2章もすべて書いてから投稿しようと思ったが疲れたので一度投稿して満足感を得ることにする。第2章:変数のスコープ項目8:グローバルオブジェクトを使うのは、最小限にとどめるグローバル名前空間に変数を作成するのは最小限にとどめる(コンポーネントを他の部分から利用できるようにするためには避けられない場合もあるが)。変数の再宣言ができるのでグローバル名前空間に変数があることに気づかずに、ローカル変数として利用しようとしてしまうケースがある。ローカル変数ではない。グローバル名前空間はグローバルオブジェクトとして公開される。オブジェクトにもバインドされている。グローバル変数を作成する方法は以下の方法がある。changedグローバルオブジェクトの利用は避けるべきだが、プラットフォームで実行できる機能を問い合わせるために利用することが多々ある。項目9:ローカル変数は、かならず宣言しようグローバル変数は避けるべきだが、偶発的にグローバル変数を宣言してしまう場合がある。使わないで変数を宣言すると暗黙的にグローバルオブジェクトに追加されてしまう。ブロックに与えられるオブジェクト)から優先的に行われる。オブジェクトまでルックアップするので遅くなる。いうマクロがあるようだがそれに影響を受けた機能なのだろうか?項目11:クロージャと仲良くしようクロージャの話。この本に書かれているクロージャのポイントは以下の通り。現在の関数の外側で定義された変数を参照できる。第2の事実:関数は、その外側の関数がリターンした後になっても、まだ外側の関数内で定義された変数を参照できる第3の事実:クロージャは外側の変数を更新できる。クロージャは、外側の変数へのリファレンスを保存するのであって値をコピーするわけではない。最近、「第3の事実」を忘れてしまって、実装中に混乱することがあった。「値を保持している」と勘違いしてしまったようだ。扱っていたのになぁ...。expression)を利用する。scoping)をサポートする。scoping)をサポートしない。変数定義は、それを最も近く囲んでいるステートメントやブロックではなく、それを囲んでいる関数をスコープとする。評価できる}この効果は「変数の巻き上げ」と呼ばれる。宣言部分を暗黙のうちにそれを囲む関数の冒頭に「巻き上げる」のだ。}}唯一ブロックスコープになるのは例外(exception)の場合。ブロックだけをスコープとする変数に束縛される。手動巻き上げ(変数は必ず関数の最初で宣言する)の手法を使ってもよい。何はともあれ、この挙動を覚えて置かないと確実にプログラムがバグる。メ...クラスの中に定義されたクラスを『ネストしたクラス』と呼ぶ。