关于setInterval和setTImeout中的this指向问题
问题:
setInterval和setTimeout中传入函数时,函数中的this会指向window对象
我们先来看一个例子:
1 | var num = 0; |
从上述例子中可以看到setTimeout中函数内的this是指向了window对象,这是由于setTimeout()调用的代码运行在与所在函数完全分离的执行环境上。这会导致这些代码中包含的 this 关键字会指向 window (或全局)对象。具体可参考MDN setTimeout
解决方案
若想要让setTimeout中的this指向正确的值,可以使用以下三种比较常用的方法来使this指向正确的值:
(1) 将当前对象的this存为一个变量,定时器内的函数利用闭包来访问这个变量,如下:
1 | var num = 0; |
这种方法是将当前对象的引用放在一个变量里,定时器内部的函数来访问到这个变量,自然就可以得到当前的对象。
(2)利用bind()方法
1 | var num = 0; |
bind()方法是在Function.prototype上的一个方法,当被绑定函数执行时,bind方法会创建一个新函数,并将第一个参数作为新函数运行时的this。在这个例子中,在调用setTimeout中的函数时,bind方法创建了一个新的函数,并将this传进新的函数,执行的结果也就是正确的了。关于bind方法可参考 MDN bind
(3) 箭头函数
使用es6的箭头函数,最为常用。
1 | var num = 0; |
ES6中的箭头函数完全修复了this的指向,向外层定义域中,一层一层的查找 this ,直到有 this 的定义。因此利用箭头函数就可以轻松解决这个问题。
Invitation
aqing
962555446
created:15/04/2021
Welcome to Candyhome
Use this card to join the candyhome and participate in a pleasant discussion together .
Welcome to aqing's candyhome,wish you a nice day .
评论