语法检查
重要性: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)` 周围的括号在这里没有任何作用。通常它们用于设置运算顺序,但在这里点 `.` 优先执行,所以没有影响。只有分号问题很重要。