0

JavaScript オブジェクト初期化子の表記法に関する質問があります。定義でインスタンスの名前を参照しているため、上の例が機能することに少し驚いています。2 つのアプローチは同一ですか? 私は通常、2 番目のアプローチを使用しましたが、同じことを達成しているようです。

var myObj = 
{
   Message:"Test",
   someMethod:function(){
      $.get("/someUrl",function(){
        myObj.Message = "Returned Value";
      })
   }
}

var myObj = 
{
   Message:"Test",
   someMethod:function(){
      var that = this; //have to capture this in order to use it in a different context.
      $.get("/someUrl",function(){
        that.Message = "Returned Value";
      })
   }
}

thisさまざまなコンテキストで変更される可能性があるため、現在の意味を追跡する必要がないため、トップアプローチには利点があると思います。他に違いはありますか?

編集:トップアプローチが常に推奨されるアプローチではないことを理解してください。ただし、特定のケースではまだいくつかの利点があると思います。そのようなケースの 1 つが KnockoutJS で、バインディングの解析によってthis、ビュー モデルのバインドされたクリック ハンドラーの意味が再定義されます。詳細はこちら: http://www.appliness.com/10-things-to-know-about-knockout-js-on-day-one/ .

この場合、現在の意味の簿記を手動で行う必要がありますthis

私は通常、2番目のアプローチを使用しますが、違いとそれが機能する理由を完全に理解しようとしていました:-)。ただし、単一インスタンスのシナリオでのみ機能することを明確に理解してください。

4

2 に答える 2

1

this何かが呼び出される方法に従って、JS インタープリターによって設定されます。オブジェクトのタイプの複数のインスタンスがある場合、これは非常に便利です (基本的に必要です)。これthisは、どのオブジェクトを参照するかを知る唯一の方法であるため、2 番目のコード例が推奨されるためです。

obj.method()のようなオブジェクトメソッド呼び出しは、メソッド内thisで自動的に設定されますobj

シングルトン (オブジェクトのインスタンスが 1 つだけ) がある場合は、必要に応じて名前付き変数を使用できますが、通常は名前を使用する必要はありませんthis。オブジェクトのメソッドへのアクセスをコーディングすれば問題なく動作します。ちゃんと。

于 2013-10-16T05:50:25.813 に答える
1

JavaScript のクロージャ セマンティクスは、ここで少し興味深いものです。実際には、論理が変数がまだ存在しないことを示している可能性があるにもかかわらず、現在割り当てられている変数をキャプチャします。

これは、実際には JavaScript の変数巻き上げの結果です。変数を代入する前に、変数を宣言する必要があります。したがって、myObjグローバルスコープにない場合でも、関数によってキャプチャされます。これは、事実上、次のように記述しているためです。

var o = (function () {
    var myObj; // hoisted declaration
    myObj = {
        message: "test",
        someMethod: function () { alert(myObj.message); },
    };
    return myObj;
})();
o.someMethod(); // alerts 'test'

ただし、これは常に機能するとは限りません。割り当てる変数をクロージャーのスコープ外に強制できる場合、その変数は実際には未定義になります。

function createObj() {
    return {
        message: "test",
        someMethod: function () { alert(myObj.message); },
    };
}

var o = (function () {
    var myObj;
    myObj = createObj();
    return myObj;
})();
o.someMethod(); // error: myObj is not defined

そのため、この名前を使用するとうまくいく場合もありますが、それははるかに脆弱なアプローチです。名前がキャプチャされていない場合、または変数の名前が内部で再利用されている場合は、完全に壊れる可能性があります。使用する代わりに名前を使用thisすると、リファクタリング時に、コードを移動するだけでもコードが壊れる可能性があり、問題がどこから来ているのかがわからない場合、デバッグが面倒になる可能性があります。

基本的に、最初の方法が機能する場合もありますが、これは一般的な解決策ではなく、単に を使用するよりも大きな利点がないため、代わりthisに使用することをお勧めしますthis

于 2013-10-16T05:54:51.130 に答える