Museumソフトウェアエンジニアのブログ。JavaScript』を読んだシリーズ。Expression)と呼ばれる手法を利用する。undefined上記のプログラムにはバグがある。ポイントは、クロージャは外側の変数を、値ではなくリファレンスによって保存するというところ。まで進んでしまっている。そこで、以下の様にして即時関数式を作成することでこの問題を解決する。その関数をすぐに実行することで、通常のコードの実行と同じ効果が得られる。一つの方法として、引数として値を渡す方法もある。関数は同じように見えるがコンテキストに依存していくつか種類がある。名前付き関数式では、関数名がその関数のローカル変数に束縛されるので、その関数内で再帰的に関数を呼び出すことが出来る。最新の仕様ではこれは削除されたが、古い仕様の実装のままの処理系も多くある。処理系もあるので注意する。上記のような理由で無理して使わないことが推奨されている。関数宣言のブロックスコープ性は仕様書で明言されていないので可搬性がない。関数の先頭で関数宣言を行うことは認められているが、ブロックスコープ内で関数宣言を行った場合の挙動は処理系に依存している。object?}上記のコードは処理系に依存して、以下の二種類の挙動に別れるらしい。なる(仕様に明記されていない挙動)一応、最新の仕様書では警告、またはエラーにすることが推奨されている。モードではこのコードはエラーとなる。変数宣言を行うと、そのスコープのローカル変数として宣言される。一般的にプログラムの動的な振る舞いに基づいてスコープが変更されるのはよくない。与えるコードを外から与えると、内部のスコープを変更する権利を外部に与えることになり、プログラムの構造を著しく破壊する。利用する場合は即時実行関数式を利用してスコープの汚染を防ぐ。それを呼び出した場所の完全なスコープにアクセスできる。