const name=“global“; var obj ={ name: ‘123‘, getName:()=>{ console.log(this.name); } } obj.getName()

题目描述:

如下代码,执行完 输出内容?

const name="global";
var obj = {
	name: '123',
   getName:()=>{
		console.log(this.name);
  }
}
obj.c

输出结果:空

如下所示:
在这里插入图片描述
易错项:

  1. “123”;
  2. “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-上)
示例:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/RedaTao/article/details/121733657