Closed
      
        Bug 705618
      
      
        Opened 13 years ago
          Closed 13 years ago
      
        
    
  
Javascript function declaration inside an if statement doesn't work as supposed
Categories
(Core :: JavaScript Engine, defect)
Tracking
()
        RESOLVED
        DUPLICATE
          of bug 585536
        
    
  
People
(Reporter: piotrek, Unassigned)
Details
Calling a function before it was declared works as supposed:
>>> (function () { foo(); function foo(){ console.log('bar'); } })()
bar
But when the call and declaration are put inside an if statement, script breaks:
>>> (function () { if (true) { foo(); function foo(){ console.log('bar'); } } })()
ReferenceError: foo is not defined
The example above works on WebKit and Internet Explorer.
Though when the function is called after the declaration, it works fine:
>>> (function () { if (true) { function foo(){ console.log('bar'); } foo(); } })()
bar
|   | ||
| Comment 1•13 years ago
           | ||
> Calling a function before it was declared works as supposed:
Yes, per spec function declarations at global and function scope get hoisted just like var.
> But when the call and declaration are put inside an if statement, script breaks:
Per spec, this should throw a parse error while parsing the script: function statements inside if blocks are not allowed in JavaScript.  In practice, various browsers added extensions supporting them, but they handle them very differently as you discovered.  For example, if different branches of the if define the function _differently_ a call after the if will do different things at least in Gecko and IE (and IE's behavior is totally messed up in that case).
You can read more about the whole mess at http://stackoverflow.com/questions/5758042/which-js-function-declaration-syntax-is-correct-according-to-the-standard if you want.
So as far as I can tell this is invalid, pending the spec actually defining behavior here.
|   | ||
| Comment 2•13 years ago
           | ||
Yeah, this is a classic issue.
Status: UNCONFIRMED → RESOLVED
Closed: 13 years ago
Resolution: --- → INVALID
|   | ||
| Comment 3•13 years ago
           | ||
I think Harmony is expected to clean up this part of the spec, although there isn't any information yet at http://wiki.ecmascript.org/doku.php?id=harmony:block_functions.
| Updated•13 years ago
           | 
Resolution: INVALID → DUPLICATE
          You need to log in
          before you can comment on or make changes to this bug.
        
Description
•