如何在JavaScript中终止已赋值且非null的运行中Timeout?
问题分析与修复方案
首先看你这段代码里有个明显的问题:你把timeout属性直接赋值成了setTimeout的返回值(一个数字ID),但在init里却尝试调用someObj.timeout()——数字是不能作为函数调用的,这会直接抛出错误,导致后续代码都没法正常执行。
另外,你想要实现的逻辑是:启动一个15秒的定时器,然后在someWork里如果定时器还在运行(也就是timeout变量有有效值),就清除它。那我们需要调整代码结构来实现这个需求:
修正后的代码
var someObj = { timeout: null, // 先初始化timeout为null,用来存储定时器ID init: function() { this.startTimeout(); // 调用启动定时器的方法 this.someWork(); }, startTimeout: function() { // 启动定时器,把返回的ID存在timeout属性里 this.timeout = setTimeout(function() { someObj.myFunc(); }, 15000); }, myFunc: function() { console.log('myFunction called'); }, someWork: function(){ console.log('some work'); // 检查timeout是否不为null(也就是定时器已启动且未被清除) if(this.timeout !== null){ console.log('clearing timeout...'); clearTimeout(this.timeout); this.timeout = null; // 清除后把timeout重置为null,避免重复清除 } } } $(function() { someObj.init(); });
关键改动说明
- 把
timeout初始化为null,专门用来存储定时器的ID,而不是直接赋值setTimeout的结果 - 新增
startTimeout方法,用来封装启动定时器的逻辑,这样代码更清晰,也避免了直接调用数字的错误 - 在
someWork里清除定时器后,把timeout重置为null,这样后续可以准确判断定时器的状态 init里调用this.startTimeout()来启动定时器,而不是错误地调用someObj.timeout()
这样调整后,当someWork执行时,如果定时器还在运行(timeout不为null),就会成功清除它,完全符合你的需求。
内容的提问来源于stack exchange,提问作者kittu
相关产品推荐
相关产品推荐

