en.javascript.info/1-js/04-object-basics/04-object-methods/2-check-syntax/solution.md
paroche a95a2f5725
Update solution.md
Wording change. (I actually like the original wording "does not give understanding" -- very concise, and communicates clearly. It's just a bit non-standard in usage).
2019-09-12 17:24:05 -06:00

1.1 KiB

Error!

Try it:

let user = {
  name: "John",
  go: function() { alert(this.name) }
}

(user.go)() // error!

The error message in most browsers does not give us much of a clue about what went wrong.

The error appears because a semicolon is missing after user = {...}.

JavaScript does not auto-insert a semicolon before a bracket (user.go)(), so it reads the code like:

let user = { go:... }(user.go)()

Then we can also see that such a joint expression is syntactically a call of the object { go: ... } as a function with the argument (user.go). And that also happens on the same line with let user, so the user object has not yet even been defined, hence the error.

If we insert the semicolon, all is fine:

let user = {
  name: "John",
  go: function() { alert(this.name) }
}*!*;*/!*

(user.go)() // John

Please note that brackets around (user.go) do nothing here. Usually they setup the order of operations, but here the dot . works first anyway, so there's no effect. Only the semicolon thing matters.