箭头函数的this分析:由声明箭头函数时所处的位置决定,与调用箭头函数时所处的位置无关。它根据声明处所在位置的外层(函数或者全局作用域)作用域的环境对象来决定this。举个例子:
function foo(){
return (a) => {console.log(this.a)}//这里的this也就是继承foo函数的环境对象
}
var obj1 = {"a": 2}
var obj2 = {"a": 3}
var bar = foo.call(obj1)//foo的环境对象为obj1,所以箭头函数的环境对象也为obj1
bar.call(obj2)//2,对于箭头函数来说,它不能使用call,apply,bind来改变环境对象
通过上面的例子,我们可以看出箭头函数的环境对象是根据声明处所在位置的外层作用域的环境对象来决定的。并且我们无法通过call,apply,bind来改变箭头函数的环境对象。
箭头函数经常用在回调函数中,比如事件处理器中和定时器中。
function foo(){
setTimeout(() => {console.log(this.a)}, 1000)
}
var obj = {"a": 2}
foo.call(obj)//2
分析:上面定义的那个箭头函数在setTimeout里面被调用,但是它所属的作用域是foo函数块内部,要谨记这一点。因此这个箭头函数的环境对象就和foo函数的环境对象是一样的。
问题是对象里面的箭头函数环境对象的分析方法:
var obj = {
"a": 2,
"fun": () => {console.log(this.a)}
}
obj.fun()//undefined