0
<script>
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);
}

</script>

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fcall

質問:

1. なぜこのように書くのですか: this.print, this.species, this.name? 「これ」を削除しようとしましたが、コンソール ログに「未定義」と表示されます

2.call(animals[i], i)それと はどう違いcall(this, i)ますか?

4

2 に答える 2

2

あなたの質問に逆の順序で答えるには...

(function()).call(...) は、関数が実行されるコンテキストを設定します。つまり、thisオブジェクトを最初の引数に設定します。あなたの例では、最初のバージョンはthisanimal[] 配列の要素に設定されています。2 番目は、コンテキストを何でも設定しthisます。ここでは、グローバル コンテキストになります。

コンテキストが設定されると、コードはthisキーワードでそれを参照できます。最初の質問thisでは、現在の animal[] 要素を参照しているため、各動物の種、名前などを抽出できます。キーワードを省略するthisと、定義されていないグローバル スコープ内の変数が参照されます。

于 2013-06-14T01:55:23.070 に答える
0

実際に匿名コンストラクター関数を作成しました。これは、匿名コンストラクター関数を作成thisしたときに参照しているものです。を使用すると、ループを通過するときに、配列内の各オブジェクト リテラルcall(animals[i])のコンテキストが変更されます。thisanimals

于 2013-06-14T02:13:32.743 に答える