私はそれが機能することを嬉しく思いますが、それでも次のコードの「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は無名関数が実行されるまで(すべてのブラウザーで機能します)それを保持しますが、これが正しい方法かどうか疑問に思います。この動作は設計によるものですか、それとも単なる幸運な事故ですか?