为啥js的箭头函数的this指向的是全局呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥js的箭头函数的this指向的是全局呢?相关的知识,希望对你有一定的参考价值。

参考技术A 剪头函数没有自己的this。箭头函数中的this值取决于箭头函数声明时所在上下文环境中的this值。 参考技术B js的箭头函数this指向不是全局的this,而是他的父级的this,也就说上级。因为在规范里,箭头函数的出现就是为了解决this乱七八糟的问题的。所以他这里没有this。

箭头函数与this指向问题

箭头函数中this的指向问题

  1. 箭头函数不会改变this的指向,在它外面拿到的this是什么,它里面获取到的就是什么
  2. setTimeout方法挂载在window上面,高程中写道,超时调用的代码都是在全局作用域下执行,非严格模式下this指向window对象,严格模式下为undefined
  3. 老的通过闭包获取this的方法,都可以通过箭头函数来替换
// 箭头函数不会改变this指向

const obj = {
  name: ‘xcc‘,
  func: function() {
    console.log(‘---1---‘, this)
  },
  func1: () => {
    console.log(‘---2---‘, this)
  },
  func2: function() {
    console.log(‘---3---‘, this)  // { name: ‘xcc‘, ...}
    setTimeout(function() {
      console.log(‘---4---‘, this)
    }, 1000)
  },
  func3: function() {
    setTimeout(() => {
      console.log(‘---5---‘, this)
    }, 1500)
  },
  func4: function() {
    const _this = this
    setTimeout(function() {
      console.log(‘---6---‘, _this)
    }, 2000)
  }
}

obj.func()  // { name: ‘xcc‘, func: [Function: func], func1: [Function: func1] }

// 箭头函数没有this的机制,在箭头函数外面拿到的是什么,在里面拿到的就是什么
obj.func1() // {}

console.log(this) // {}


obj.func2()

// setTimeout方法是挂在window对象下的。《JavaScript高级程序设计》第二版中,
// 写到:“超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined”
// 箭头函数中的this始终都是指向当前作用域的this
obj.func3() // ---5--- { name: ‘xcc‘, ...}


// 采用闭包来获取this
obj.func4() // ---6--- { name: ‘xcc‘, ...}

以上是关于为啥js的箭头函数的this指向的是全局呢?的主要内容,如果未能解决你的问题,请参考以下文章

箭头函数的特点

看一遍就能掌握 js 中的 this 指向

ES6里箭头函数的陷阱

react 传参为啥使用箭头函数?

bind() 和 箭头函数的this

Vue中匿名函数和箭头函数的this