ES6对象方法声明对象时,箭头函数this的指向问题

基础

  1. 没有this、super、arguments 和 new.target 绑定
  2. 不能通过 new 关键字调用
  3. 没有 prototype
  4. 不可以绑定this 的绑定
  5. 不支持argument
  6. 不支持重复命名参数

疑问

// 第一种 用 var 定义 value  
var value = '小明'

const foo = {
  value: '小红',
  getValue: () => console.log(this.value)
}

foo.getValue() // => 输出的是小明

// 第二种 用 const 定义 value
const value = '小明'
const foo = {
   value: '小红',
   getValue: () => console.log(this.value)
}

foo.getValue() // => undefind

上面两个示例,第一个输出 小明 第二个输出undefined ,都是直接请求的全局的属性,因为const不会自动挂到 window 属性上,因此会输出 undefined。

原因

箭头函数是由声明的时候决定的。

箭头函数 this 的指向(不仅仅是this,其实super, new.target 等)由 外围最近一层非箭头函数决定

在对象声明的时候, value 和 getvalue() 都是 foo的内部属性(方法),则他们的外围自然是全局了。

关键的点在于getvalue:()=>{} 和 getvalue:function(){} 和 getvalue(){} 这三种形式对于方法的声明,应该怎么看待。

后面两个声明方式在功能上是等价的,第三种是es6 新增的简写方式。而第一个箭头函数和两者的却比在于箭头函数本身以及this指向等。

三者在声明的过程中,任然和value 属性一样,是属于foo 内部的,与foo 等价的。

因此在使用箭头函数声明getvalue 方法的时候,this 是由foo 外围决定的,而foo 的外围就是 window ,所以getvalue 的this 指向是window .

 

你可能感兴趣的:(es6)