返回课程

语法检查

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