withの挙動がFirefoxとIE・Operaで違う件
(function(){ var namespace={a:'hogehoge'}; with(namespace){ alert(a); } })();
上記のコードのようにwith文の中で、どのスコープでも未定義の変数aを使おうとすると、
with文の括弧の中に入ってるオブジェクトのaプロパティを代わりに使ってくれます。
これはもちろんIE・Firefox・Opera共通。
(function(){ var namespace={a:'hogehoge'}; with(namespace){ function fuga(){ alert(a); } } fuga(); })();
今度はwith文の中で宣言した関数の中で同じく変数aを使おうとした場合です。
Firefoxだとhogehogeとalertが出るけど、
IE・Operaだとaは未定義だと怒られてしまいます。
(function(){ var namespace={a:'hogehoge'}; with(namespace){ function fuga(){ alert(a); } fuga(); } })();
関数の実行箇所がwith文の中でも結果は同じ。
たぶん、理由は同じスコープ内ではfunction 関数名(){}で宣言された
関数の定義が真っ先に行われるからだと思います。
(function(){ var namespace={a:'hogehoge'}; function fuga(){ with(namespace){ alert(a); } } fuga(); })();
with文を関数の中に持ってくれば当然OK
(function(){ var namespace={a:'hogehoge'}; with(namespace){ var fuga = function(){ alert(a); } } fuga(); })();
関数の宣言を、ローカル変数への無名関数の代入に置き換えた場合もOK