レッスンに戻る

構文チェック

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