Why does this work:
a = []
a.push(['test']);
(function() {alert('poop')})()
But this gives the error "number is not a function":
a = []
a.push(['test'])
(function() {alert('poop')})()
The only difference is the semicolon at the end of line 2. I've been writing JavaScript for a long time now. I know about automatic semicolon insertion, but I can't figure out what would be causing this error.
Take a look at this example of chained function calls.
a.push(['test'])(function() {alert('poop')})()
Look familiar? This is how the compiler/interpreter views your code.
Detail
Here is a portion of the grammar used to describe call expressions.
CallExpression : MemberExpression Arguments CallExpression Arguments CallExpression [ Expression ] CallExpression . IdentifierName
Essentially each group (...) is considered as Arguments to the original MemberExpression a.push
.
a.push (['test']) // MemberExpression Arguments
(function() {alert('poop')}) // Arguments
() // Arguments
Or more formally
CallExpression( CallExpression( CallExpression( MemberExpression( a.push ), Arguments( (['test']) ) ), Arguments( (function() {alert('poop')}) ) ), Arguments( () ) )
I'm not a Javascript expert (or even a newbie :), but if you combine the second and third lines, it still looks syntactically valid:
a.push(['test'])(function() {alert('poop')})()
That's trying to treat the result of a.push(['test'])
as a function, passing a function into it... and then calling the result as a function as well.
I suspect that the semi-colon is required if the two statements can be syntactically combined into a single statement, but that's not what you want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With