在使用js中的this时,由于js的语法规则,this的指向是会改变的,js中的this指向是根据函数在执行时的作用域而定的,而不是在函数定义时的作用域而定的,这就使我们在使用异步回调函数时由于this的指向发生改变而头疼不已,如下代码:
示例一、同步函数:
var peopel = {
name:'四月天',
getName:function(){
console.log(this.name)//此时this指向people对象。
}
}
peopel.getName();//输出 "四月天"
示例二、下面我们在运行一个异步执行的情况:
var peopel = {
name:'四月天',
getName:function(){
setTimeout(function() {
console.log(this.name);//此时this指向window对象。
}, 1000);
}
}
peopel.getName();//输出 undefined
由于我们设置了在1秒之后再来执行上面函数,这时候 this已经指向了全局的window对象而不再是peopele对象了,因此输出 undefined。
在ES5中为了解决this指向改变的问题,我们会采用绑定函数定义时的this来解决:
示例三、ES5解决办法
var peopel = {
name:'四月天',
getName:function(){
var _this = this;
setTimeout(function() {
console.log(_this.name)
}, 1000);
}
}
peopel.getName();//输出 "四月天"。得到我们期望的效果。
在ES6中的箭头函数解决了我们上述的问题,让我们在使用this时不再担心this指向会改变。
ES6中this
指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this
,导致内部的this
就是外层代码块的this
。这使得我们在箭头函数里面使用的this
就是我们在定义函数时的this
,正是因为它没有this
,所以也就不能用作构造函数。
我们对示例二的代码使用通过箭头函数进行优化:
var peopel = {
name:'四月天',
getName:function(){
setTimeout(()=>{
console.log(this.name);//使用箭头函数,this永远是定义函数时的this(这里指peopel);
}, 1000);
}
}
peopel.getName(); //输出 "四月天"。通过箭头函数我们没有通过临时变量来绑定this就得到我们期望的效果。
箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
上面四点中,第一点尤其值得注意。this对象的指向是可变的,但是在箭头函数中,它是固定的。
对this的理解其实就是在函数体内调用this的时候向上找一层,这个函数属于谁,this就指向谁。
参考:一缕殇流化隐半边冰霜的揭开 this & that 之迷
推荐:饿了么前端前端知乎专栏
网友评论