withの挙動がFirefoxとIE・Operaで違う件

(function(){
	var namespace={a:'hogehoge'};
	with(namespace){
		alert(a);
	}
})();

上記のコードのようにwith文の中で、どのスコープでも未定義の変数aを使おうとすると、
with文の括弧の中に入ってるオブジェクトのaプロパティを代わりに使ってくれます。
これはもちろんIEFirefoxOpera共通。

(function(){
	var namespace={a:'hogehoge'};
	with(namespace){
		function fuga(){
			alert(a);
		}
	}
	fuga();
})();

今度はwith文の中で宣言した関数の中で同じく変数aを使おうとした場合です。
Firefoxだとhogehogeとalertが出るけど、
IEOperaだと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