1

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

4

1 に答える 1

5

それは設計によるものです。閉鎖といいます。

関数が別の関数内で定義されている場合、外側の関数のローカル変数はクロージャーに入れられるため、外側の関数が終了した後もそれらは存続します。内部関数は、後で変数にアクセスできるようにクロージャーを保持します。

于 2013-01-13T03:57:02.313 に答える