在JavaScript中,声明变量在函数内外的问题

文章描述了一个在JavaScript实现的随机点名系统中遇到的问题,即由于变量作用域导致的定时器无法正确清除。问题出现在定时器变量`sel`的声明位置。解决方案是将`varsel`声明提升到`st.onclick`函数外部,确保在函数内外都能访问到,从而使得`clearInterval(sel)`能够在第二次点击时正确执行,停止点名过程。
摘要由CSDN通过智能技术生成

项目场景:

编程语言是JavaScrip,项目是随机点名系统。


问题描述

声明一个定时器的函数,并且定时器的函数包含在一个大函数中,出现的问题:当声明的变量在大函数外和大函数内效果是不同的

st.onclick = function(){

if(bu1){

 var sel=setInterval(function(){      //问题:1.再此处声明sel   2.在st.onclick上面声明一个sel

var num1=Math.round(Math.random()*(str1.length+0-1));

str2.innerHTML=str1[num1];

},10)

st.innerHTML="点击停止";

bu1=false;

}else{

st.innerHTML = "点击开始";

clearInterval(sel);

bu1=true;

//console.log(sel);//undefined

}

}

</script>


原因分析:

在”1“处声明变量,当第一次点击onclick时,在堆里开启一个新的空间用来存储对象,按照顺序的运行,if是成立的,运行完if之后,bu1会被赋值false;当第二次点击onclick时,将会重新再堆里开辟另一个新的空间,但是bu1是false,并且不会执行if语句,直接执行else里面的内容,但是在这个新的空间里,sel并没有被声明,所以else中的clearInterval(sel)是无法执行的,sel是undefined,因此第二次点击的时候,是无法停止并且获取名字


解决方案:

把var sel定义在st.onclick上面,var sel;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值