Function declarations in statements

Brendan Eich brendan at
Sat Mar 17 11:27:38 PDT 2007

On Mar 17, 2007, at 4:41 AM, Igor Bukanov wrote:

> js> var x = 10;
> js> function f() { print(x); if (false) var x; }
> js> f();
> undefined
> js>  function g() { print(f); if (false) function f() {}; }
> js> g()
> function f() {
>     print(x);
>     if (false) {
>         var x;
>     }
> }
> That is, in the first f() "if (false) var x;" defines x for the whole
> function yet in g() the function statement does not bind the local
> name until executed.

That's right -- var and function are not equivalent. You cannot  
rewrite function f() {} as var f = function (){}.

Independent of this long-standing fact, which is detectable even in  
ES1-3, never mind function statements or other such extensions: the  
idea with function statements in SpiderMonkey (and Rhino, IIRC) is  
precisely that they allow conditional binding of DontDelete DontEnum  
names to function objects, depending on control flow.


More information about the Es4-discuss mailing list