構文チェック
重要度: 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)
を取り囲む括弧は、何も機能しないことに注意してください。通常、これらは演算の順序を設定しますが、ここではドット.
が最初に機能するため、効果はありません。セミコロンのみが重要です。