5

以下のコードで、somethingUseful.thisUsefulThingが から呼び出された場合setTimeout、 を参照できますsomethingUseful.thatUsefulThingか?

var somethingUseful = {
  thisUsefulThing: function() {
    this.thatUsefulThing();
  },

  thatUsefulThing: function() {
    console.log("I am useful!");
  }
}

setTimeout(somethingUseful.thisUsefulThing, 1000);

現在、次のエラーが発生しています。

Uncaught TypeError: Object [object global] has no method 'thatUsefulThing'
4

2 に答える 2

3

あなたの質問に簡単に答えるには、はい、thisUsefulThing は thatUsefulThing にアクセスできます

しかし、あなたのコードが現在実行されているように、'this' は実際にはグローバルではなく、すべての直接の子孫自体への somethingUseful への参照です。

リテラル オブジェクトを扱うときは、通常、「this」ではなく名前で参照するので、あなたの場合は「this.thatUsefulThing()」を somethingUseful.thatUsefulThing() に置き換えます。

なんで?とにかく、それはグローバルに機能するからです!

編集:

plalx が私の回答へのコメントで指摘したように、このクラスを実装するためのベスト プラクティス (クラス メンバーの例を使用) は、機能クラス/プロトタイプを使用し、次のようになります。

function SomethingUseful () {
    this.member = 'I am a member';
}
SomethingUseful.prototype.thisUsefulThing = function () {
    this.thatUsefulThing();
}
SomethingUseful.prototype.thatUsefulThing = function () {
    console.log('I am useful, and ' + this.member);
}
usefulObject = new SomethingUseful();

usefulObject.thisUsefulThing(); // logs fine with access to this.member
setInterval(usefulObject.thisUsefulThing.bind(usefulObject), 1000); // has access to this.member through bind()
于 2013-10-23T23:35:57.530 に答える
1

this値を にバインドするだけsomethingUsefulです。

setTimeout(somethingUseful.thisUsefulThing.bind(somethingUseful), 1000);
于 2013-10-23T23:43:06.743 に答える