首页 > JS定时器的一个问题

JS定时器的一个问题

    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声明,否则容易在严格模式下出问题

【热门文章】
【热门文章】