this指向问题一直是一个让新手很困扰的问题,这篇文章着重讲含有定时器时this的指向
问题。segmentfault
关于不包含定时器的this指向,这篇文章讲的很清楚,看完以后相信能使小白茅塞顿开超级传送门。函数
话很少说,开始!this
bind(this)
。(或者由内而外寻找:能够改变this指向的函数的this
为箭头函数的this
(如:function(){}
),若是没有,则为全局做用域的this)let obj={ a:222, fn: function() { setTimeout(function(){console.log('fn', this)}) }, fn0: function() { console.log('fn0', this); }, fn1: () => { console.log('fn1', this); }, fn2: function() { setTimeout(() => {console.log('fn2', this, this.a)}) } }; obj.fn(); // window obj.fn0();// {a: 222, fn: ƒ, fn0: ƒ, fn1: ƒ, fn2: ƒ} obj.fn1();// window obj.fn2();// {a: 222, fn: ƒ, fn0: ƒ, fn1: ƒ, fn2: ƒ}
setTimeout()
等同于window.setTimeout()
。普通函数this的指向是:谁调用指向谁,fn
里面的function是经过setTimeout()
调用的,因此this指向window
code
fn0
是obj.fn0()
调用的,因此fn0
的this指向obj对象
官方解释:箭头函数的this指向定义时所在的this。作用域
个人理解:由内而外寻找:能够改变this指向的函数的this
为箭头函数的this
。如:function(){}
get
套用理解:fn1()
->obj.fn1()
。没有能够改变this指向的函数,则为全局做用域的thisio
套用理解:fn2
->window.setTimeout()
(没有可改变this指向的函数)->function() {}
(改变this指向,查找谁调用了函数)->obj.fn2()
(obj调用函数,this指向obj)console
const obj = { num: 10, hello: function () { console.log(this); setTimeout(function() { console.log(this); }); }, outf: outFun } function outFun() { console.log('outFun', this); // obj setTimeout(function() { console.log('outFun', this); // window }); setTimeout(() => { console.log('outFun', this); // obj }); } obj.hello(); obj.outf();
普通函数:谁调用指向谁。outfun
是由obj.outf()
调用的,因此指向objfunction
function()
->window.setTimeout()
,函数是由window调用的,因此指向window
()=>{}
(向外寻找)->window.setTimeout()
(没有可改变this指向的函数)->outFun()
(改变this指向,查找谁调用了函数)->obj.outf()
(obj调用函数,this指向obj)
const obj = { num: 10, hello: function () { console.log(this); setTimeout(function() { console.log(this); }); }, outf: outFun } const outFun = () => { console.log('outFun', this); // window setTimeout(function() { console.log('outFun', this); // window }); setTimeout(() => { console.log('outFun', this); // window }); } obj.hello(); obj.outf();
outFun
->obj.outf()
(没有能够改变this指向的函数,this指向全局做用域的this)