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