1

JavaScript では、コールバック (AJAX 呼び出しなど) である内部関数を使用する場合、それらは独自の環境 (thisはウィンドウ オブジェクト) で実行され、記述されている場所を認識しませんthis。そして、私はそのための2つの解決策を見てきました:

  • selfor :を使用(変数thatの自動ボックス化によって実行)self
var Obj = function(){
    var a = 1;

    var subFunc = function(){
        var self = this;
        $.ajax({
            url: 'something.x',
            success: function(data){alert(self);}
        });
    }

    return {
        subtract : subFunc
    }
};

var o = new Obj();
o.substract();
  • コマンドの使用bind: (これがどのように行われるかわかりません)
var Obj = function(){
    var a = 1;

    var subFunc = function(){
        $.ajax({
            url: 'something.x',
            success: function(data){alert(this);}.bind(this)
        });
    }

    return {
        subtract : subFunc
    }
};

var o = new Obj();
o.substract();

通訳者が実際に通訳を開始したときの違いは何ですか?これはパフォーマンスにどのような影響を与えますか?

4

3 に答える 3

3

bind は一般的に、経験豊富な JS 開発者に好まれます (少なくとも私が働いた場所では)。

JavaScript のスコープは、最初は理解しにくいものです。これは、新しい関数を定義するときに「this」がクロージャーに含まれていないためです。あきらめて、それを指す新しいローカル変数を作成したくなるかもしれませんが、これを行うと自分自身を制限しています.

bind の利点は、一度慣れると、言語を一貫して使用できることです。

JS で多くのクラスを作成しますか? バインドに慣れると、オブジェクトで関数を呼び出すことが、その関数をローカル変数に設定してから呼び出すことと異なる理由がわかります。これは、スコープについて常に考えているためです。あなたはそれを宣言するので、「これ」がどこから来たのかを常に知っています。

また、コード ベースを乱雑にする "self" 変数と "that" 変数の繰り返しの宣言と読み取りの煩わしさを回避できます。

bind の欠点は、一般には利用できないことです。しかし、そのためのポリフィルを作成する (またはオンラインで検索する) ことは非常に教育的であり、二度と心配する必要はありません!

いずれにせよ、パフォーマンスへの影響があるとは思えません。確かに、通常の日常使用ではありません。

于 2013-03-01T09:31:17.347 に答える
1

var selfvsを使用する利点の 1 つ.bind()は、最近友人から指摘されました。

エグゼの場合:

function () {
  var self = this;

  $('selector').map(function () {
    this.attr('href');

    self.doThis();
  });
}

thisこのようにして、2 つのスコープを使用できます。私はそれが物事を混乱させる可能性があるという他の答えに同意しますが、それにはその場所があると思います.

Heresベンチマーク 実質的にゼロの違いがあります。繰り返しますが、これは非常に単純なテストです。

于 2014-04-11T18:18:22.740 に答える
0

バインディングを使用しない場合は、 ではthatなくを使用することをお勧めしselfます。

これselfは、有効なグローバル変数 (のwindow.self) であるためです。以前は scope という名前を付けてselfいましたが、ある日、そのvar self = this行を忘れてしまいました... これは、期待するほどデバッグが容易ではありませんでした。私は現在thatormeを使用しており、バインディングを使用しないことが多いです。

于 2014-10-30T04:49:19.100 に答える