题目描述:
如下代码,执行完 输出内容?
const name="global";
var obj = {name: '123',getName:()=>{console.log(this.name);}
}
obj.c
输出结果:空
如下所示:
易错项:
- “123”;
- “global”
解析:
1.为什么不是 “123”
如 this指向这篇文章 第 3 条所示:
3.函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。
如: var bar = obj1.foo();
上题中 使用 “obj.getName()“调用,恰好符合这条规则,按理说 getName方法中的 this应该指向obj,输出的应该是 “123”(obj.name),但是 getName 是一个 箭头函数!!! 我们先将题目中的 getName修改成 function 定义的函数:发现 这次执行 输出的是 预期的”123“。
那为什么 改成箭头函数就不行了呢?
因为:箭头函数中 函数体内的 this 对象是定义时所在对象,而不是使用时所在的对象, 并且它是固定的
(见 ES6标准入门 P118-上)
getName 函数定义时,箭头函数的 this 指向的是 window对象,我们可以 console一下:
#####2.为什么不是“global”?
上边说了,getName 指向的箭头函数的 this 指向的是 window 对象,我们在最开头 已经const name="global";
定义了 name,为什么输出的 不是 “global” 而是 空呢?
因为:ES6规定 使用let、const、class等命令声明的 全局变量不属于 顶层对象的属性
(见ES6标准入门第三版 P31-上)
示例: