5 回答
TA贡献1804条经验 获得超3个赞
//修改
this.timer = setTimeout(this.change.bind(this), this.s);
初始化运行正常,定时器触发后,change函数作为setTimeout的回调函数,此时this指向了window,执行this.arr[this.i]报错.
最后,函数调用是txt.change(),不是txt.changeColor()
TA贡献1993条经验 获得超5个赞
楼上说的是对的,这是关于this
的指向的问题,要搞清楚this
是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件,this
的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。具体可以看下我总结的一篇读书笔记JavaScript基础系列--打败this
第一次直接调用txt.change()
的时候,this
指向txt
这个对象,所以self
也指向txt
这个对象,所以初始化的时候运行正常。setTimeout
的回调的调用位置始终是全局作用域,所以回调里面的this
是指向全局对象---浏览器里是window
对象,现在你把self.change
作为setTimeout
的回调,那么定时器到点触发后,回调self.change
里的this
就指向window
了,而window
是没有arr,i
这些属性的,所以执行到if (this.arr[this.i])
时会报错:Cannot read property 'undefined' of undefined
TA贡献1796条经验 获得超7个赞
楼上说的是对的,这是关于this的指向的问题,要搞清楚this是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件,this的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。具体可以看下我总结的一篇读书笔记JavaScript基础系列--打败this
txt.change()
第一次直接调用的时候,this指向txt这个对象,所以self也指向txt这个对象,所以初始化的时候运行正常。
setTimeout的回调的调用位置始终是全局作用域,所以回调里面的this是指向全局对象---浏览器里是window对象,现在你把self.change作为setTimeout的回调,那么定时器到点触发后,回调self.change里的this就指向window了,而window是没有arr,i这些属性的,所以执行到if (this.arr[this.i])时会报错:Cannot read property 'undefined' of undefined
添加回答
举报