15

その非常にリテラルの一部である関数内でオブジェクトリテラルを参照することは問題がありますか?うまく機能しているようですが、他に影響がないことを確認したいと思います。

これが私が話していることの例です:

それ以外の:

var obj = {
    key1: "it",
    key2: function(){return this.key1 + " works!"}
};
alert(obj.key2());

使用:

var obj = {
    key1: "it",
    key2: function(){return obj.key1 + " works!"}
};
alert(obj.key2());
4

5 に答える 5

21

どちらも問題になる可能性があります。

var obj = {
    key1: "it",
    key2: function(){ return this.key1 + " works!" }
};
var func = obj.key2;
alert(func()); // error

funcが のメソッドとして呼び出されない場合obj、他のthisものを参照できます (ここでは、グローバル オブジェクト " window")。

var obj = {
    key1: "it",
    key2: function(){ return obj.key1 + " works!" }
};
var newref = obj;
obj = { key1: "something else"; };
alert(newref.key2()); // "something else works"

ここでは、別の参照からオブジェクトにアクセスしますがobj、関数内の は別のオブジェクトを指している可能性があります。

したがって、どちらのケースがより可能性が高いかを選択する必要があります。本当に安全にしたい場合は、obj交換を防ぎます。

// ES6 - use `const`:
const obj = {
    key1: "it",
    key2: function(){ return obj.key1 + " works always!" }
};

// ES5: use a closure where the `obj` is stored in a local-scoped variable:
var obj = (function(){
    var local = {
        key1: "it",
        key2: function(){ return local.key1 + " works always!" }
    };
    return local;
})();

またはbind()、オブジェクトへの関数:

var obj = {
    key1: "it",
    key2: function(){ return this.key1 + " works always!" }
}
obj.key2 = obj.key2.bind(obj);
于 2012-05-22T22:42:30.770 に答える
1

可変スコープのバインディングには違いがあります。後でobjを変更する場合は、key2の戻り値を変更します。

var newobj = obj;
obj = { key1: "new" };
alert(newobj.key2());

key2()元のオブジェクト(現在はnewobj)を呼び出している場合でも、への参照obj.key1は新しいobjインスタンスの値にバインドされるため、「newworks!」というアラートが表示されるようになりました。を使用thisすると、これが発生しなくなります。

デモ: http: //jsfiddle.net/m6CU3/

于 2012-05-22T22:33:24.893 に答える
1

プロトタイプ オブジェクトを使用していない場合は、そのようにします。オブジェクトのすべてのインスタンスが obj インスタンスの値を返すため...

于 2012-05-22T22:35:37.777 に答える
1

状況に応じて、これらの手法のいずれかまたは両方が適用される場合があります。

関数内の の値はthis、関数の呼び出し方法によって異なります。次のように関数をオブジェクトのプロパティとして呼び出す場合:

obj.key2();
//or
obj["key2"]();

次にthis、そのオブジェクトになります。オブジェクトがオブジェクト リテラルまたはその他の手段で作成されたかどうかは関係ありません。

.call()ただし、 orを使用.apply()して関数を呼び出し、明示的thisに他のオブジェクトに設定することができます。

以下も考慮してください。

var obj = {
    key1: "it",
    key2: function(){return this.key1 + " works!"}
};
alert(obj.key2()); // alerts "it works!"

var func = obj.key2;
alert(func())​;     // alerts "undefined works!"

funcと同じ関数を参照するように設定していますobj.key2が、 として呼び出すと に設定されfunc()ませthisobj

詳細については、MDN が について述べていることthisをご覧ください。

于 2012-05-22T22:42:51.173 に答える
0

頭のてっぺんからは何の影響もないと思います。誤ってこれを行わないように注意してください。

var obj = {
    key1: "it",
    key2: key1 + " works!"
}

それはエラーの原因になります。それ以外は、行ってもいいはずです!

于 2012-05-22T22:31:34.003 に答える