箭头函数用=>的写法,更加简洁
箭头函数创建时不会创建自己的this,只会从自己的作用链上继承上级的this
定义是获取所处外层执行环境的this,并且不会变
举个🌰
var id = 'window'
function fn1 () {
setTimeout(function () {
console.log(this.id)
})
}
function fn2 () {
setTimeout(() => {
console.log(this.id)
})
}
fn1.call({id: 'obj'}) // 'window'
fn2.call({id: 'obj'}) // 'obj'
这段代码就很神奇,外层定义一个id,fn1,fn2里面都是定时器,一个普通函数,一个箭头函数,调用时都应用call改变了this。 fn1的普通函数,在定时器执行时已经是在window环境,所以是window。 fn2的箭头函数,因为是定义时就锁定了外层的this,所以在fn2调用时用call改变了this,打印了obj
另一个🌰
var obj = {
id: 'OBJ',
a: function(){
console.log(this.id);
},
b: () => {
console.log(this.id);
}
};
obj.a(); // 'OBJ'
obj.b(); // 'GLOBAL'
obj.a()执行时,a的普通函数中的this是在obj中的this,即为obj对象中的id obj.b()执行时,b的箭头函数中的this是在window中的this,即使是通过obj.调用的也是window