回到课程

检查语法

重要程度: 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) 外边这层括号在这没有任何作用。通常用它们来设置操作的顺序,但在这里点符号 . 总是会先执行,所以并没有什么影响。分号是唯一重要的。