3

3 つのパラメーターを受け入れる単純な匿名関数を使用します。

function hello(firstname, surname, city) {
    console.log('Hi ' + firstname + ' ' +
                        surname + '. I see you\'re from ' + city)
}

関数を呼び出すだけでなく、関数メソッド「call」を使用してこの関数を呼び出す利点は何ですか? 、すなわち。

hello('Jane','Mansfield','Philadelphia');

hello.call(this,'Jane','Mansfield','Philadelphia');

フィドルディーディー: http://jsfiddle.net/wC3xz/1/

申し訳ありませんが、ドキュメントを見ても何の光も当てていません。私が考えることができる唯一のことは、関数に渡された this オブジェクトにアクセスできるかどうかです。しかし、無名関数内からこれにアクセスすることは、無名関数、つまりウィンドウのコンテキストではありませんか?

functionname(args) だけでなく call が必要になるのはいつですか?

4

4 に答える 4

10

では、通話の重要な点は何ですか?

Call は、セクション 15.3.4.4の仕様で定義されています。.call関数内で thisArg を設定しようとしているときに使用します。

伊藤はどう使う?

これを使用する方法の例を次に示します。

var me = { name: 'dr.eval' }

foo.call(me); // if you omitted the 'call' it would error because this defaults to the window object.

function foo() {
    alert(this.name + ' is home');
}

ここで詳細を読むことができます: Function.prototype.call

いつ使用しますか?

call を使用する場合の非常に標準的な例を次に示します。

多くの DOM メソッドは を返しNodeListます。NodeList は配列のようなオブジェクトですが、これらの配列メソッドをネイティブに呼び出すことはできません。ただし、それらは設計上、配列のようであるため、次を使用して配列メソッドを使用できます。.call

コンソールを開いて入力すると

document.getElementsByTagName("a").forEach

forEach メソッドを持たない NodeList を返すため、未定義になります。ただし、NodeList を反復することが望ましい場合があるため、次のことができます。

[].forEach.call(document.getElementsByTagName("a"),function(elem){
     console.log(elem);
});

ページ上のすべてのアンカー要素をログに記録します。

別の一般的な例はarguments、別の「配列のような」オブジェクトです。多くの場合、引数を配列のように処理したいのですが、できません。繰り返しになり.callますが、救助に来て、次のことができます。

[].slice.call(arguments,0); // returns a clone of arguments, but a real array we can work with!

また、イベントを操作するときにも役立ちます。一般的に、JavaScript がいかに柔軟であるかを示しています。これは、他の方法では共有できなかったオブジェクト間で機能を共有する方法です。

于 2013-05-23T15:23:15.823 に答える
1

あなたが使う

.call

.apply

オーバーライドに関しては。

this詳細については、良い記事です。

于 2013-05-23T15:27:44.380 に答える
0

一般的に call() を使用する利点は、関数のコンテキストを明示的に設定できることです。あなたが示すように、単純な関数にはあまり価値がありませんが、関数がオブジェクトのメソッドである場合、またはコールバックである場合、コンテキストの設定が関連する可能性があります。

于 2013-05-23T15:25:18.980 に答える