1

私は JavaScript でスコープをいじっていますが、配列から関数を呼び出すときに遭遇したことに興味がありました。以下の例では、3 つの異なるスコープを使用しています。1 つは foobar というオブジェクトにバインドされ、もう 1 つは window にバインドされ、3 つ目は実際に関数自体を参照します。関数のスコープがグローバル ウィンドウ オブジェクトではなく、それ自体に限定されている理由が気になります。配列アクセスは関数呼び出しそのものなのでストアド関数はローカルスコープにあるからでしょうか?

var foobar = {
  doWork: function() {
      console.log('doing some work...');
      console.log(this);
  }
}

foobar.doWork(); // `this` will refer to foobar

var doWorkClone = foobar.doWork;
doWorkClone(); // `this` will refer to window

var workClones = [];
workClones.push(foobar.doWork);
workClones[0](); // `this` will refer to the doWork function itself
4

2 に答える 2

4

彼らは同じように振る舞います。ではa.b()、関数a.bthisset toで呼び出されaます。

foobar.doWork();  // function is `foobar.doWork`, `this` is `foobar`
workClones[0]();  // function is `workClones[0]`, `this` is `workClones`

これは、.[]表記が機能的に同じであるためです。どちらを使用しても、配列を扱っているかどうかも問題ではありません。

于 2012-08-22T16:39:57.813 に答える
0

これを理解するには、文字通り、js が内部でどのように機能するかを確認すると役立つ場合があります。

と書くf(args)とjsが実行されf.call(this, args)ます。したがってthis、常に関数を呼び出す場所を参照します。

あなたの場合:

foobar.doWork()   --> foobar
doWorkClone()     --> window or wrapping expression
workClones[0]()   --> "0" is in workClones, so workClones
于 2012-08-22T16:52:40.467 に答える