返回課程

語法檢查

重要性:2

這段程式碼的結果是什麼?

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

(user.go)()

附註:有一個陷阱 :)

錯誤!

試試看

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) 周圍的括號沒有作用。通常它們會設定運算順序,但這裡的點 . 會先運算,所以沒有效果。只有分號有關係。