1

MDNから:

var animals = [
  {species: 'Lion', name: 'King'},
  {species: 'Whale', name: 'Fail'}
];

for (var i = 0; i < animals.length; i++) {
  (function (i) {
    this.print = function () {
      console.log('#' + i  + ' ' + this.species + ': ' + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

上記の例では、"animals" ループ内の無名関数で "this" がどのように使用されているのでしょうか? 「これ」がウィンドウではなく動物オブジェクトを参照している理由が気になります。

たとえば、引数からanimal[i]を削除すると、すべてが未定義になります。それは、匿名関数が受け取った最初のパラメーターから「ID」を取得することを意味しますか、それとも何か他のことが起こっているのでしょうか?

前もって感謝します!

4

3 に答える 3

3

Isn't this explained in the documentation of function.call() you quote yourself?

fun.call(thisArg[, arg1[, arg2[, ...]]])

Parameters

thisArg The value of this provided for the call to fun. [...]

and later:

Description

You can assign a different this object when calling an existing function.

So you are right, animals[i] is used as this inside a function. You can treat it as implicit, hidden parameter that always has this name.

于 2012-11-15T17:29:48.783 に答える
2

それはこの部分です:

  }).call(animals[i], i);

で呼び出すことにより.call()、 の値thisが明示的に指定されます。

Functionプロトタイプから利用できる 2 つの同様の関数があります:.call().apply(). どちらも、関数 (匿名かどうかに関係なく、実際の違いはありません) を特定の値 (オブジェクトへの参照) として呼び出すことができますthis

の値はthis、関数が呼び出されると常に何らかの方法で設定されます。関数への参照が.or[ ]式によって決定される場合:

something.fn( whatever );

something[ expression ](whatever);

の値thisは、ベース オブジェクトの値です (上記の例では「何か」)。Eich 氏はそれを「レシーバー」と呼んでいますが、これは、Smalltalk メッセージのような関数呼び出しを考えると理にかなっています。

ベース オブジェクトなしで関数を呼び出した場合、 の値はthisグローバル オブジェクトか、null「厳密」モードの場合です。

于 2012-11-15T17:29:25.683 に答える
1

call次のように定義されているものを使用しているためです。

call(thisScope, args)

だからあなたが手段animal[i]として渡しているという事実。thisScopethis == animal[i]

于 2012-11-15T17:29:40.567 に答える