背景
《现代 JavaScript 教程》中的题目
语法
很多面向对象的语言在语法层面都会绑定 this:在对象中定义的方法总是有指向该对象的 this
也就是说,创建对象实例后,在对象方法中的 this 关键字会绑定到这个对象实例上
但是 JavaScript 不同,它的 this 取值不取决于方法声明的位置,而是取决于是哪个对象执行了该方法,取决于代码执行的上下文环境,这很重要。
在函数里定义的 this,要看具体执行这个函数的是哪个对象
如果没有对象,即全局环境,分两种情况
- 严格模式:this 是 undefined
- 非严格模式:this 是全局对象(浏览器中的 window)
题目
分析
我们讨论在严格模式下的情况,答案是会报错
首先,makeUser() 函数是在全局环境下用 “函数声明” 定义的函数
在代码第八行执行了这个函数,此时的上下文是全局上下文,所以 this 是 undefined
那么得到的 user 变量是这样的结构
user = {
name: "John",
ref: undefined
}
所以在第十行访问 user.ref.name 的时候,相当于 undefined.name,所以会报错
ps:我一开始没搞懂这个 undefined 是从哪儿来的,其实是定位到代码执行第八行的结果
答案