箭头函数中this

作者: sunny519111 | 来源:发表于2017-08-08 17:44 被阅读178次

箭头函数中this

建议先阅读本人对于es5中this的详解 es5中的this详解

箭头函数本身是没有this,导致内部的this就是外层代码块的this

ES6的箭头函数的出现,让很多刚刚入门的前端很少用到bind()call()apply(),但是还是有必要弄懂this

关键词

  1. 上下文作用域
  2. 绑定上下文

1. 普通函数和箭头函数比较

  • 不使用call
// 1. 不使用call
var str = 'hcc'
let foo = function() {
  let str = 'yx'
  console.log(this.str) 
}
const foo2 = () => {
  let str = 'hcc2'
  console.log(this.str)
}
foo() //'hcc'
foo2() //'hcc'
// 由于箭头函数的绑定上下文,所有foo2中的this指向为上级作用域即` window `
  • 变形: 使用call改变this
var str = 'hcc'
let foo = function() {
  let str = 'yx'
  console.log(this.str) 
}
const foo2 = () => {
  let str = 'hcc2'
  console.log(this.str)
}
foo.call({a:1}) //undefined
foo2.call({a:1}) //'hcc'
// 由于箭头函数本身没有this,我们通过call改变箭头函数的this是没有效果的,foo2中的this还是指向` window `

2.高级函数的比较

  • 箭头函数和普通函数
const foo = function() {
  return () => {
    console.log(this === window)
  }
}
foo.call({a:1})()  //false
// foo函数中返回一个箭头函数,对于箭头函数而言,foo函数就是它的执行上下文,通过call绑定foo的this,所以对于箭头函数而言,this就是对象{a:1}
const foo2 = () => {
  return () => {
    console.log(this === window)
  }
}
foo2.call({a:1})() //true
// 对于foo2函数而言,自己本身也是一个箭头函数,返回一个箭头函数,2个都没有this,通过call绑定不会生效,所以找到最外层的` window `
  • setTimeout中的this (在箭头函数之前,setTimeout中的this指向的是全局的window,setTimeout中的箭头函数没有this,所以寻找上下文中的this)
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}
var id = 21;
foo()  // 21 
// 由于通过foo.call(null)调用foo,foo函数的内部this指向window,setTimeout中的箭头函数没有this,所以返回21

foo.call({id: 42}) // 42
// 通过call指定了foo函数执行上下文的this为{id: 42},对于箭头函数而言,foo就是执行上下文,所以返回42

3. 对象中的使用

var handler = {
  id: '123456',

  init: function() {
    document.addEventListener('click',
      event => this.doSomething(event.type), false);
  },

  doSomething: function(type) {
    console.log('Handling ' + type  + ' for ' + this.id);
  }
};

handler.init()  //  转换 handler.init.call(handler)

解析:当我们执行handler中的init方法的时候,init中的this指向的是handler,所以我们在init方法内部使用的所有箭头函数中的this都会指向handler

拓展

请问下面的代码之中有几个this

function foo() {
  return () => {
    return () => {
      return () => {
        console.log('id:', this.id);
      };
    };
  };
}

var f = foo.call({id: 1});

var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1

上面代码之中,只有一个this,就是函数foothis,所以t1t2t3都输出同样的结果。因为所有的内层函数都是箭头函数,都没有自己的this,它们的this其实都是最外层foo函数的this

相关文章

  • 九、箭头函数 ------ 2020-04-06

    1、箭头函数的创建: 2、箭头函数中没有arguments 3、箭头函数中没有自己的this

  • 箭头函数

    1,箭头函数定义 2,Es6 中箭头函数参数与返回值简写 补充 3,箭头函数中 this 指向 注:箭头函数中的t...

  • ES学习笔记

    [摘抄自网络] 箭头函数 箭头函数中的this箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个...

  • 箭头函数没有绑定this

    ==箭头函数没有绑定this== 不要把【箭头函数】和【箭头函数的定义函数】弄混淆 ecma262规范中明确规定,...

  • 一句话明白箭头函数中的this

    关于箭头函数中this值的问题,网上查查,会告诉你 “箭头函数的this固定化,箭头函数中的this绑定定义时所在...

  • 函数的this是什么时候绑定的

    箭头函数是没有this的,箭头函数中的this只取决于包裹箭头函数的第一个普通函数的this。

  • 【Dart】函数

    声明函数 直接声明Dart中声明函数不需要function关键字 箭头函数+Dart中 的箭头函数中,函数体只能写...

  • 常见前端面试题

    箭头函数与普通函数的区别 箭头函数语法比普通函数更加简洁,但箭头函数中没有arguments,所以形参可以使用展开...

  • ES6-箭头函数

    箭头函数中的this ES6函数参数默认值 箭头函数不适用的场景

  • this

    在箭头函数中,就算是setTimeout()方法中,this指向的也是函数所在作用域的对象 非箭头函数中,this...

网友评论

    本文标题:箭头函数中this

    本文链接:https://www.haomeiwen.com/subject/eqqxrxtx.html