JavaScript类中setInterval传函数与lambda表达式的差异问题
报错根本原因
问题核心是JavaScript普通函数的this指向是动态绑定的:
- 直接把
this.Move作为参数传入setInterval时,你传递的只是Move函数本身的引用,该函数和当前子弹类实例的绑定关系会被切断。 setInterval执行回调时,默认会把回调的this指向浏览器全局对象window,严格模式下则为undefined。你的Move方法中用到了读取实例style属性的逻辑,此时this不是目标类实例,自然无法读取到style属性,触发类型错误。
两种写法的本质差异
- 第一种写法
setInterval(this.Move, 0):仅传递了Move方法的裸引用,定时器执行该方法时没有绑定类实例上下文,this指向不符合预期,无法访问实例属性。 - 第二种箭头函数包裹的写法:箭头函数自身不存在独立的
this,它的this完全继承自定义位置的外层作用域的this。该箭头函数定义在类构造函数中,外层this就是当前的子弹类实例,所以调用this.Move()时this始终指向正确的实例,不会出现指向丢失的问题。
你也可以用bind手动绑定上下文实现相同效果:
setInterval(this.Move.bind(this), 0)
内容的提问来源于stack exchange,提问作者shayan bajelan
相关产品推荐
相关产品推荐

