When I run this code, it works, as you would expect:
var b = {}
b['foo']=[]
b['foo'].push(1)
But when I try doing this as a one-liner, like this:
var b = {}
(b['foo']=[]).push(1)
It throws: Cannot set properties of undefined (setting 'foo')
, even though b
is very clearly defined.
Could someone explain this behavior? Thanks in advance.
Edit: For some reason, adding the semicolon fixes the issue, which confirms that the compiler was in fact trying to run it as a function. But now I have another question: Why did it throw an error saying b
is not defined, instead of b
is not a function?
CodePudding user response:
As noted by Reyno, this is parsed as
var b = {}(b['foo']=[]).push(1)
since there is no semicolon delimiting var b = {}
and (b['foo']=[]).push(1)
. The question that remains is why this throws
Cannot set properties of undefined (setting 'foo')
rather than
Uncaught TypeError: {} is not a function
which ought to be thrown for {}()
. The reason for this is that
var b = {}(b['foo']=[]).push(1)
is equivalent to
var b; b = {}(b['foo']=[]).push(1)
The right-hand side of the assignment is evaluated first, so before the call is made, it evaluates b['foo']
to evaluate the inner assignment, but b
is undefined
, leading to the error Cannot set properties of undefined (setting 'foo')
.