JS中if语句内定义的变量如何传递到其他if/else分支使用?
问题根因
- 你对
let的作用域规则理解错误,let属于块级作用域,仅在声明它的{}包裹的代码块内有效。你在第一个if的代码块内部声明的mytimer,出了这个if的大括号就会被销毁,后续的else分支、下方的其他if语句自然无法访问,就会提示变量未定义。 - 如果你之前用
var声明也遇到问题,是因为var虽然是函数级作用域,变量会提升到myFunction的顶部,但只有第一个if分支实际执行时,mytimer才会被赋值。如果第一个if没有触发,mytimer的值就是undefined,调用清除方法虽然不会报未定义,但也不会生效。 - 额外注意:你用
setInterval创建的定时器,规范上应该用clearInterval清除,你现在写的clearTimeout属于浏览器兼容的野路子,不建议这么用。
适配方案
你提到无法在if语句外部定义变量,可以用以下两种方式实现需求:
方案1:挂载到函数对象属性(推荐)
函数本身就是对象,可以直接挂载自定义属性存储定时器,不会污染外部作用域:
function myFunction(){ if(/* 你的判断条件 */){ myFunction.mytimer = setInterval(function() { alert("hello"); }, 1000); } else if(/* 你的判断条件 */){} else{ clearInterval(myFunction.mytimer); } if(/* 你的判断条件 */){ clearInterval(myFunction.mytimer); } }
方案2:挂载到全局对象(仅应急使用)
如果场景允许,可以把定时器挂载到window全局对象上,全函数内都可以直接访问:
function myFunction(){ if(/* 你的判断条件 */){ window.mytimer = setInterval(function() { alert("hello"); }, 1000); } else if(/* 你的判断条件 */){} else{ clearInterval(window.mytimer); } if(/* 你的判断条件 */){ clearInterval(window.mytimer); } }
内容的提问来源于stack exchange,提问作者Jack the man
相关产品推荐
相关产品推荐

