1
var x = 10;
var o = { x: 15 };

function f()
{
    alert(this.x);
}

f();
f.call(o);

最初のものは私に「10」を表示し、2番目のものは出力値として「15」を表示します。どのリアルタイム シナリオで「call」メソッドと f() を同時に使用するかは誰にもわかりません。

4

2 に答える 2

3

未回答の質問を閲覧しているだけで、これがあなたに役立つかどうかはわかりませんが、この質問に出くわした人には役立つかもしれません。

関数オブジェクトでメソッドを使用すると、関数によって参照されるオブジェクトcall()をオーバーライドできます。this独自のコードブロックで期待される結果を示しました。

このメソッドは、予想される引数形式を除いてapply()、とほぼ同じ機能を実行することに注意してください。call()

call()引数はコンマ区切り形式でapply()ある必要がありますが、配列である必要があります。どちらの場合も、最初の引数はオーバーライドされるオブジェクトですthis

ECMA仕様

ECMA仕様(pdf警告)にはcall()、特定の関数の実行コンテキストを変更する際の使用法を示すことが記載されています。

13.2.1[[電話]]

関数オブジェクトFの[[Call]]内部メソッドがthis値と引数のリストを使用して呼び出されると、次の手順が実行されます。

  1. funcCtxを、Fの[[FormalParameters]]内部プロパティの値、渡された引数List args、および10.4.3で説明されているこの値を使用して、関数コードの新しい実行コンテキストを確立した結果とします。
  2. Fの[[Code]]内部プロパティの値であるFunctionBodyを評価した結果を結果とします。Fに[[Code]]内部プロパティがない場合、またはその値が空のFunctionBodyである場合、結果は(normal、undefined、empty)になります。
  3. 実行コンテキストfuncCtxを終了し、前の実行コンテキストを復元します。
  4. result.typeがスローされた場合は、result.valueをスローします。
  5. result.typeがreturnの場合、result.valueを返します。
  6. それ以外の場合、result.typeは正常である必要があります。未定義を返します。
于 2013-02-26T16:17:47.517 に答える
0

どのリアルタイム シナリオで「call」メソッドと f() を同時に使用するかは誰にもわかりません。

オブジェクトのメソッドである関数は、そのオブジェクトをthisとして呼び出すことが期待されます。たとえば、組み込みのArray.prototype.forEachメソッドを使用すると、メソッドはthisが Array インスタンスであることを期待します。

ただし、メソッドは汎用であるため、インスタンスは配列である必要はありません。メソッドが機能するには、配列に十分似たオブジェクトである必要があります。ほとんどのブラウザーでは、ホスト オブジェクトである NodeList を渡すことができるため (一部のブラウザーはこれを好みません)、次のように NodeList を渡してforEachを呼び出すことができます。

Array.prototype.forEach.call(
  document.getElementsByTagName('*'),
  function(element){ 
    console.log('This element is a ' + element.tagName)
  }
);

ドキュメントの下部にあるスクリプト要素に配置すると、上記はすべての要素のタグ名をコンソールに書き込みます。

上記の呼び出しは、次のように短縮されることがあります。

[].forEach.call(...)

新しい Array インスタンスを作成し、その[[Prototype]]チェーンを使用してforEachにアクセスします。

したがって、配列インスタンスには単純なforEachが必要であり、それをcallで個別に使用する必要があることがわかります。thisを他の値に設定してメソッドを呼び出すことができる他のケースもあります (DOM 要素のリスナーなど)。

于 2015-01-16T22:45:17.260 に答える