箭头函数是个好东西,写起来函数方便,结构清晰,但是如果你习惯了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