我很高兴它有效,但仍然有点混淆“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一直保持到匿名函数执行(适用于所有浏览器),但我想知道这是否正确。这种行为是设计还是仅仅是一次幸运的事故?
答案 0 :(得分:4)
这是设计的。它被称为闭包。
当在另一个函数中定义一个函数时,外部函数中的局部变量被置于一个闭包中,这样即使在外部函数结束后它们也能存活。内部函数保持闭包,以便稍后可以访问变量。