2

thisJavaScript は自動的に各関数/メソッドに parameterを割り当て、thisそれを含むオブジェクトにバインドされることを理解しています。

メソッドは、オブジェクトのプロパティとして格納される関数です。したがって、メソッドでthisは、それを含むオブジェクトから値を変更または取得するために使用できます。ただし、そのメソッドがオブジェクトのプロパティとしてではなく関数として呼び出された場合、オブジェクトでthisはなくグローバルにバインドされます。

回避策は、次を割り当てることです。

var that = this;

メソッド内で、内部関数がthis変数を介してアクセスできるようにしますthat

私の質問は: なぜこの回避策が必要なのですか? 常にメソッドを使用することはできませんか? 完全に適切なメソッドを内部関数として呼び出すのに、別の変数を作成して、代わりにメソッドとして呼び出された場合にアクセスできるようにする必要があるのはなぜですか?

ここで重要な何かが欠けているに違いありません。ダム質問タグがあれば、それを使用します。(誰か作ってくれませんか?)

4

4 に答える 4

2

thisandの質問は他の場所でthat雄弁かつ簡潔に答えられているので、あなたの質問に答えます: なぜ内部関数を呼び出すのですか?

なぜだめですか?

リンクされた回答を出発点として使用する:

$('#element').click(function(){
    // this is a reference to the element clicked on

    var that = this;

    $('.elements').each(function(){
        // this is a reference to the current element in the loop
        // that is still a reference to the element clicked on
    });
});

新しいオブジェクトをインスタンス化し、必要なすべての変数を渡し、いくつかの要素をループするためだけに適切な環境を手動で構築する利点は何でしょうか? ここには適切な環境があり、スコープはまさに必要な場所にあります。

内部スコープ内で変数にアクセスする必要がある場合はthis、内部スコープで再利用されるため、変数を再割り当てする必要があります。この場合、that私の意見ではあまり明確ではない which を使用する人もいますが、これは、これらの非常に便利な一時的な内部スコープにスコープを渡す方法にすぎません。

それが本当に鍵です。一時的なスコープの変更です。ここで問題がなければ、まったく新しいスコープやシンボル テーブルなどを作成する必要はありません。

于 2013-09-20T15:13:55.267 に答える
0

理由の 1 つは、コンテキストとして設定した場合、他のオブジェクトでそのメソッドを使用したい場合があることですcallapply

    var obj = {
        名前:「ふー」
    }、

    ロガー = 関数 (名前) {
        this.name = 名前;
        this.log = 関数 () {
            console.log(この名前)
        }
    };

    var bar = new logger('bar');
    bar.log(); // -> 'バー'
    bar.log.call(obj); // -> 'フー'
于 2013-09-20T15:22:03.387 に答える