使用setTimeout的变量的范围

时间:2013-01-13 03:42:46

标签: javascript scope settimeout

我很高兴它有效,但仍然有点混淆“me”变量的范围在下面的代码中。现在使用它一段时间但无法弄清楚它为何起作用。

var timer=function(){
    this.timerMember=1;
    this.timerID=0;
    this.startTimer=function(){
        var me=this;
        this.timerID=setTimeout(function(){
            //shares scope with this.startTimer
            //timerMember is 2 here
            console.log(me.timerMember);
            // this is window
            console.log(this);
            // me doesn't exist in window
            console.log(this.me);
        },0);
//  this code gets executed before anonymous
//  timer function
//        clearTimeout(this.timerID);
        this.timerMember++;
    }
}
var t=new timer();
t.startTimer();

传递给setTimeout的匿名函数似乎与timer.startTimer共享范围,但是当匿名函数执行时,startTimer显然已经完成(me.timerMemer = 2),所以当startTimer完成时,me变量应该超出范围。幸运的是,JavaScript一直保持到匿名函数执行(适用于所有浏览器),但我想知道这是否正确。这种行为是设计还是仅仅是一次幸运的事故?

1 个答案:

答案 0 :(得分:4)

这是设计的。它被称为闭包。

当在另一个函数中定义一个函数时,外部函数中的局部变量被置于一个闭包中,这样即使在外部函数结束后它们也能存活。内部函数保持闭包,以便稍后可以访问变量。