構文チェック
重要性: 2
このコードの結果はなんでしょう?
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)()
P.S. 落とし穴があります :)
エラーです!
やってみましょう:
let user = {
name: "John",
go: function() { alert(this.name) }
}
(user.go)() // error!
ほとんどのブラウザでのエラーメッセージは何を間違えているのか理解できません。
user = {...} の後にセミコロンがないため、エラーになります。
JavaScript 括弧 (user.go)() の前にはセミコロンを想定していないので、このようにコードを解釈します:
let user = { go:... }(user.go)()
そして、このようなジョイント式は構文的にはオブジェクト { go: ...} を引数 (user.go) をもつ関数として呼びだすことができます。また、それは let user と同じ行で起こります。なので、user オブジェクトはまだ定義されていないのでエラーになります。
セミコロンを挿入すると、すべてうまく行きます。:
let user = {
name: "John",
go: function() { alert(this.name) }
};
(user.go)() // John
(user.go) の周りの括弧はここではなにもしないことに注意してください。通常それらは操作の順番のために設定されますが、ここではドット . がとにかく最初に動作するので影響がありません。セミコロンだけが関係します。