ES6 浅谈 箭头函数指问题向 This

箭头函数是个好东西,写起来函数方便,结构清晰,但是如果你习惯了es5中的this使用,在使用和理解es6时候可能会受到干扰,借鉴网上案例解析学习一下。

讲解过程和我关于《浅谈this关键字案例》中的顺序一样,对比学习有助于理解和记忆。

首先理解下:箭头函数中的this是在定义函数的时候绑定(es6),而不是在执行函数的时候绑定(es5)。

定义时候绑定,this是继承父级执行上下文中的this!那么执行上下文是什么?执行上下文就是执行环境!那么执行环境是什么?执行环境就是你的变量或者函数能在什么范围内执行,也就是作用范围,作用域!

1.存放在对象中:出现key:value的函数形式,认为是平级!

顺序 es5  es6  不要弄乱
var x=11;
var obj={
  x:22,
  say:function(){
    console.log(this.x)
  }
}
obj.say();  
//console.log输出的是22  

var x=11;
var obj={
 x:22,
 say:()=>{
   console.log(this.x);
 }
}
obj.say();
//输出的值为11            

2.存在构造函数  

es5 
function Obj(){
              this.x=1;
              this.y=2;
              this.func=function(){
                  console.log(this);
             };
         }
   var o1=new Obj();
   o1.func()                      obj对象


es6 
var a=11;
function test2(){
  this.a=22;
  this.b=()=>{console.log(this.a)}
 }
var x=new test2();       
x.b()                              22

再看一种构造函数储存的模式  仔细看

es5
var a=11
function test1(){
  this.a=22;
  let b=function(){
    console.log(this.a);
  };
  b();                   发生执行,函数指向window
}
var x=new test1();
输出11


es6
var a=11;
function test2(){
  this.a=22;
  let b=()=>{console.log(this.a)}
  b();                   即使发生执行,函数指向父级执行环境
}
var x=new test2();
//输出22

箭头函数中,this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数,不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。同时没有arguments ,不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用Rest参数代替。可以使用yield命令,因此箭头函数不能用作Generator函数。 

this固定化的好处,看下面代码:

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);     指向了foo 而不是window
  }, 100);
}

// ES5
function foo() {
  var _this = this;
  setTimeout(function () {
    console.log('id:', _this.id);     原来解决办法,比较麻烦
  }, 100);
}

网上很多例子可以学习,

var a=100;
var b = {
    a:1000,
	d:{
	a:1,
	c:{
	  getA:()=>{
		console.log(this.a);
		}
	  }	
	}  
}
b.d.c.getA()

记住 key:value是平级,你就能顺利找到真正的父级执行上下文   
答案是:100


var x = 11;
    var obj = {
      x: 22,
      methods: {
        x: 33,
        say: function () { console.log(this.x) },
        say2: () => { console.log(this.x) }
      }
    }
 
    obj.methods.say();           33
    obj.methods.say2();          11

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值