名前付き関数式で定義されたグローバル関数からはクロージャが使えません。
(function () {
var a = 'abc';
void function Foo () { alert (a); };
}) ();
Foo (); // Exception: ENameError(3) => undefined -a
グローバルスコープだけを見ているようです。
var a = 'outside';
var f = (function () {
var a = 'inside';
return function Foo () { alert (a); };
}) ();
f (); // inside
Foo (); // outside
(function () {
var a = 'inside2';
Foo (); // outside
})();
定義した関数の中身に関しては通常通りクロージャが働きます。
(function () {
void function Foo () {
var a = 'abc';
(function () { alert (a); }) ();
};
}) ();
Foo (); // abc