1

私はjQueryとJavaScriptのオブジェクトと関数に頭を悩ませ、それがどのように機能しthis、どこを指しているのかを把握しようとしています。

なぜこれが機能するのか誰かに説明してもらえますか?

Cat.prototype.meowLater = function() {
    var self = this;
    window.setTimeout(
        function() {
            self.meow();
        }
        , 1000);
}

私が興味を持って混乱しているselfのは、タイマーによって呼び出される無名関数で変数に実際にアクセスできる理由です。self別の関数で宣言されているので、ローカルであり、その関数にのみアクセスできると思いました。

4

3 に答える 3

2

関数は、親スコープから変数を継承します(同じ名前でスコープが狭い別の変数によってマスクされていない場合)。

匿名関数selfはスコープが設定されている関数内で定義されているため、それにアクセスできます。

于 2012-05-19T20:38:55.847 に答える
2

内部関数は、外部関数で使用可能な変数を使用できます。

ここ、

Cat.prototype.meowLater = function() {
    // I create the variable self that refers to the this (the current object)
    var self = this;

    // I create a timeout that calls the self.meow function within an anonymous function
    /*** NOTE : You don’t always have to create an anonymous function it’s just that in
        this case, it is required ***/
    window.setTimeout(
        function() {
            self.meow();
        }
        , 1000);
}

以来、setTimeoutはの内部関数でありCat.prototype.meowLater、にself利用できますsetTimeout

また、 現在のオブジェクトを参照しているため、ここで
は使用していません。this.meow()thiswindowsetTimeout

于 2012-05-19T20:43:13.420 に答える
1

Javascriptにはネストされたスコープがあるため、別の関数内の関数は、外部関数からすべての変数を継承します(まだスコープ内にあります)。非同期関数(setTimeoutこの場合)を使用すると、変数selfはスコープ付きの自己変数this(Catインスタンス)を参照しますthisが、ウィンドウになります。

うまくいけば、それは慣れるのに少し時間がかかるものです。

于 2012-05-19T20:43:05.437 に答える