window.onload = function(){
var oBtn1 = document.getElementById("btn1");
var oBtn2 = document.getElementById("btn2");
var timer = null;
oBtn1.onclick = function (){
timer = setInterval(function(){ //timer是全局变量,外部可访问
alert("1")
},1000)
};
oBtn2.onclick = function (){
clearInterval(timer);
};
}
1.在外层定义的timer是全局变量吗?
2.不在外层定义timer = null,直接在oBtn1的函数里面将定时器函数赋值给timer,后面关闭定时器也是可以的,写不写这个var timer = null是必要的吗?
共有3种方式定义全局变量:
1.在任何函数之外放置一个var语句:
var foo = value; //声明一个不可删除的全局变量
2.直接给全局对象添加一个属性。全局对象是所有全局变量的容器,在Web浏览器里,全局对象名为window:
window.foo = value;//创建全局对象的一个可删除属性
3.直接使用未经声明的变量,这被称为隐式的全局变量:
foo = value;//创建全局对象的一个可删除属性
所以,不仅仅是有没有var的问题,本质上它们不同:当声明一个JavaScript全局变量时,实际上是定义了全局对象的一个属性,使用方式1创建的属性不可删除,使用方式2,3创建的属性可以删除。
严格模式下,使用方式3抛错;非严格模式下使用方式3在代码量很大的情况下也极易发生错误,推荐国外的一篇文章 how one missing 'var' ruined our launch(少写了一个var毁了我的网站)
如果少了var timer=null,你在第一个点击函数中的timer直接赋值没有使用var声明,所以默认是全局函数,第二个点击函数当然可以clear掉。
只是代码规范问题,最好在全局函数中使用var声明,否则容易在严格模式下出问题