如何使用setInterval执行Warriors类的randomizeWinner函数?
问题解决
核心错误修正
你的代码存在三处关键问题,逐一修正后即可正常运行:
- 随机索引计算错误
原代码中Math.floor(Math.random() * this.playersArray.length - 1)会产生负数索引(当Math.random()返回0时,结果为-1),正确的随机索引应取0到数组长度-1之间的整数,改为:
const random = Math.floor(Math.random() * this.playersArray.length);
- splice方法参数错误
splice的第一个参数是元素索引,不是元素值,原代码传入this.playersArray[random]是元素本身,应该直接传计算好的索引random:
const eliminated = this.playersArray.splice(random, 1); console.log('被淘汰的玩家:', eliminated);
- setInterval终止逻辑缺失
当数组元素被删空后,定时器仍会继续执行导致报错,需要在方法内判断数组长度,为空时清除定时器:
完整修正代码
class Warriors extends User { constructor(size) { super(size); // 保存定时器ID,用于后续清除 this.intervalId = null; } randomizeWinner() { // 数组为空时清除定时器并终止执行 if (this.playersArray.length === 0) { clearInterval(this.intervalId); console.log('所有玩家已淘汰,停止定时器'); return; } const random = Math.floor(Math.random() * this.playersArray.length); const eliminated = this.playersArray.splice(random, 1); console.log('被淘汰的玩家:', eliminated); } } const w = new Warriors(); // 保存定时器ID到实例属性,方便后续清除 w.intervalId = setInterval(() => w.randomizeWinner(), 3000);
关于setInterval调用类方法的说明
你原代码中用w.randomizeWinner.bind(w)是可行的,但用箭头函数() => w.randomizeWinner()更直观——箭头函数会自动继承当前作用域的this,不需要手动绑定,两种方式都能保证方法内的this指向Warriors实例。
内容的提问来源于stack exchange,提问作者gerfg grgr
相关产品推荐
相关产品推荐

