JavaScriptにおける関数属性メソッドのapplyとcallの使用例を詳しく解説

伊谢尔伦
リリース: 2017-07-25 11:55:29
オリジナル
1258 人が閲覧しました

すべての JavaScript 関数には、toString()、call()、apply() などの多くのメソッドが付属しています。関数に独自のメソッドがあるというのは奇妙に聞こえるかもしれませんが、JavaScript のすべての関数はオブジェクトであることを覚えておいてください。 JavaScript の機能を確認 (復習) するには、この記事を参照してください。 JavaScript の関数とメソッドの違いも知りたいかもしれません。 「関数」や「メソッド」の記述は単なるJavaScriptの規約だと思います。関数は独立しています (例:alert())。メソッドは関数内のオブジェクトのプロパティ (ディクショナリ) であり、オブジェクトを通じてメソッドを呼び出します。各 JavaScript オブジェクトには toString() メソッドがあります。以下は、関数オブジェクトで toString() メソッドを使用できるコードの例です。


function foo(){
 alert('x');
}
alert(foo.toString());
ログイン後にコピー

関数はオブジェクトであるため、独自のプロパティとメソッドがあります。それらはデータとして考えることができます。この記事では、apply() と call() の 2 つの関数メソッドのみに焦点を当てます。

次のコードから始めます:


var x = 10;
function f(){
 alert(this.x);
}
f();
ログイン後にコピー

グローバル関数 f() を定義します。 f() は this キーワードを通じて変数 x にアクセスしますが、オブジェクトのインスタンスを通じてこの関数を呼び出すことはできないことに注意してください。これはどのオブジェクトを指しているのでしょうか?これは、このグローバル オブジェクトを指します。変数 x は、このグローバル オブジェクトで定義されます。上記のコードは正常に実行でき、結果としてダイアログ ボックスに 10 が表示されます。

これを通じて call() と apply() を呼び出すことができます。次の例は、call() の使用方法を示しています。


var x = 10;
var o = { x : 15};
function f(){
 alert(this.x);
}
f();
f.call(o);
ログイン後にコピー
ログイン後にコピー

最初に f() を呼び出すと、この時点ではグローバル オブジェクトを指しているため、10 のダイアログ ボックスが表示されます。次に、f 関数の call() メソッドを呼び出します。入力パラメータは o で、実行結果には o の x 属性の値 15 が表示されます。 call() メソッドは、最初のパラメータを f 関数の this ポインタとして使用します。言い換えれば、 f 関数の this がどのオブジェクトを指しているのかをランタイムに伝えます。

このジャンプは、C++、Java、C# のプログラマーにとっては少しおかしく、少し異常にさえ聞こえます。これらは ECMAScript の楽しい部分です。

call() を通じて関数にパラメータを渡すこともできます。


var x = 10;
var o = { x : 15};
function f(){
 alert(this.x);
}
f();
f.call(o);
ログイン後にコピー
ログイン後にコピー

apply() は call() と似ていますが、apply() では 2 番目のパラメータが配列である必要がある点が異なります。この配列はパラメータとしてターゲット関数に渡されます。


var x = 10;
var o = {x : 15};
function f(message) {
 alert(message);
 alert(this.x);
}
f('invoking f');
f.apply(o, ['invoking f through apply']);
ログイン後にコピー

apply() メソッドは、ターゲット メソッドのパラメータを気にせずに関数を作成できるため便利です。この関数は、apply() の 2 番目の配列パラメータを通じて追加のパラメータをメソッドに渡すことができます。


var o = {x : 15};
function f1(message1) {
 alert(message1 + this.x);
}
function f2(message1, message2) {
 alert(message1 + (this.x * this.x) + message2);
}
function g(object, func, args) {
 func.apply(object, args);
}
g(o, f1, ['the value of x = ']);
g(o, f2, ['the value of x squared = ', '. Wow!']);
ログイン後にコピー

この文法には何か問題があります。 apply() メソッドを呼び出すために、ターゲット関数に配列内のパラメーターを使用するように強制します。幸いなことに、この構文を簡素化する方法があります。その前に、パラメータ識別子を導入する必要があります。

JavaScript では、実際には各関数に可変長のパラメーター リストがあります。これは、関数にパラメータが 1 つしかない場合でも、関数に 5 つのパラメータを渡すことができることを意味します。次のコードにはエラーはなく、結果は「H」になります。


function f(message) {
 alert(message);
}
f('H', 'e', 'l', 'l', 'o');
ログイン後にコピー

f() で、他のパラメータを受け入れたくない場合は、キーワード引数を使用できます。 argument はパラメータ オブジェクトを表し、配列と同様に長さを表す属性を持ちます。


function f(message) {
 // message的值和arguments[0]是一样的
 for(var i = 1; i < arguments.length; i++){
  message += arguments[i];
 }
 alert(message);
}
// 结果显示“Hello”
f(&#39;H&#39;, &#39;e&#39;, &#39;l&#39;, &#39;l&#39;, &#39;o&#39;);
ログイン後にコピー

厳密に言えば、引数は配列ではないことを知っておく必要があります。引数には length 属性がありますが、split、push、pop メソッドはありません。前の g() 関数では、必要なパラメータを引数からコピーして配列を形成し、この配列を apply() に渡すことができます。


var o = {x : 15};
function f(message1, message2) {
 alert(message1 + ( this.x * this.x) + message2);
}
function g(object, func) {
 // arguments[0] = object
 // arguments[1] = func
 var args = [];
 for(var i = 2; i < arguments.length; i++) {
  args.push(arguments[i]);
 }
 func.apply(object, args);
}
g(o, f, &#39;The value of x squared = &#39;, &#39;. Wow!&#39;);
ログイン後にコピー

g() を呼び出すとき、引数を配列に詰め込む代わりに、追加の引数をパラメータとして渡すことができます。

以上がJavaScriptにおける関数属性メソッドのapplyとcallの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート