1

2 つのコード スニペットに違いはありますか?

fooは のメンバー関数であるためobj、それ自体thisを参照しobjます (メソッド呼び出しパターン)。

1.

var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(obj.prop);
};

2.

var obj = {};
obj.prop = some_property;
obj.foo = function() {
  do_something_with(this.prop);
};

私が取り組んでいたアプリケーションは、アプローチ2を使用するとクラッシュし続けました。

コードは次のようなものでした:

obj = {};
obj.listener = {
  eventprocess : function(param) {
    //some code
  }
};
obj.init = function() {
  this.a = library_func();
  this.a.add_listener(this.listener);
};

アプローチ1を使用したときに機能しました。

理由はありますか?

4

1 に答える 1

2

objandの解決は関数の実行まで延期されるため、定義と呼び出しの間でor/andが変更さthisれたかどうかによって結果が異なる場合があります。thisobj

たとえば、2 つのオブジェクトが同一であるとします。ただし、一方は関数内で使用されthis、他方はobj関数内で使用されますfoo

var objA = {};
objA.prop = "test";
objA.foo = function() {
  alert(this.prop);
};

var objB = {};
objB.prop = "test";
objB.foo = function() {
  alert(objB.prop);
};

...ここで異なる動作が見られます:

var anotherObject = {
  objAFoo: objA.foo,
  objBFoo: objB.foo
};

anotherObject.objAFoo(); // "undefined";
anotherObject.objBFoo(); // "test";

http://jsfiddle.net/3D6xY/

コメントで指摘されているように、またはをthis使用して値を設定することで、この動作を正規化できることに注意してください。call()apply()

anotherObject.objAFoo.call(objA); // "test";

http://jsfiddle.net/3D6xY/1/

thisただし、拘束されbind()たりjQuery.proxy()、ここであなたを傷つける可能性がある場合にも注意してください.

于 2013-01-09T11:44:00.620 に答える