项目场景:
编程语言是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;