初めて技術記事を翻訳したとき、私はあなたを笑いました!
翻訳された元のテキスト:
function.apply and function.call in javascript
最初の段落は省略されています。
各JavaScript関数には、toString()、call()、Apply()など、多くの添付の方法があります。関数に独自の方法があるかもしれないことは奇妙に思えるように思えますが、JavaScriptのすべての関数はオブジェクトであることを忘れないでください。この記事を見て、(refresher)javascriptの機能を確認してください。また、JavaScriptの機能とメソッドの違いを知りたい場合があります。 「関数」と「メソッド」の説明は、JavaScriptの習慣的な慣習にすぎないと思います。関数はそれ自体(例:alert())に基づいており、メソッドは関数内のオブジェクトの属性(辞書)であり、オブジェクトを介してメソッドを呼び出します。各JavaScriptオブジェクトには、toString()メソッドがあります。以下はコードの例です。関数オブジェクトでは、toString()メソッドを使用できます。
function foo(){alert( 'x');} alert(foo.tostring());関数はオブジェクトであるため、独自のプロパティとメソッドがあります。それらをデータと考えることができます。この記事では、2つの関数apply()とcall()の方法にのみ焦点を当てます。
次のコードから始めましょう。
var x = 10; function f(){alert(this.x);} f();グローバル関数f()を定義します。 f()このキーワードを介して変数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 15のx属性の値を示します。呼び出し()メソッドは、F関数へのこのポインターとして最初のパラメーターを使用します。つまり、これがF関数でこれを指し示すオブジェクトを実行時に指示します。
このジャンプは少し面白く聞こえますが、C ++、Java、およびC#プログラマーにとっても異常です。これらはすべてECMAScriptの興味深い部分です。
call()を介してパラメーターを関数に渡すこともできます。
var x = 10; var o = {x:15}; function f(){alert(this.x);} f(); f.call(o);apply()およびcall()は類似していますが、2番目のパラメーターが配列である必要があることを除いて。この配列は、ターゲット関数の引数として渡されます。
var x = 10; var o = {x:15}; function f(message){alert(message); alert(this.x);} f( 'f'); f.apply(o、['apply spull 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){object.apply、object、args); f2、[x squared = 'の値!'];この構文には何か問題があります。 Apply()メソッドを呼び出すために、目的関数にアレイ内のパラメーターを使用するように強制します。幸いなことに、この構文を簡単にする方法があります。この前に、最初に次のものを紹介する必要があります。パラメーター識別子。
JavaScriptでは、各関数には実際には可変長さのパラメーターリストがあります。これは、関数に1つのパラメーターしかない場合でも、5つのパラメーターを渡すことができることを意味します。次のコードにはエラーがなく、結果には「H」が表示されます。
function f(message){alert(message);} f( 'h'、 'e'、 'l'、 'l'、 'o');f()では、他のパラメーターを受け入れたくない場合は、キーワード引数を使用できます。引数は、配列に似た長さを表す属性を持つ引数オブジェクトを表します。
function f(message){//メッセージの値は、(var i = 1; i <arguments.length; i ++){var i = 1; i <arguments.length; i ++)の引数[0]と同じです。 } alert(message);} //結果は "hello" f( 'h'、 'e'、 'l'、 'l'、 'o')を示しています。厳密に言えば、議論は配列ではないことを知っておく必要があります。引数には長さの属性がありますが、分割、プッシュ、およびポップメソッドはありません。以前のg()関数では、必要なパラメーターを引数からコピーし、配列を形成してから、この配列を渡して適用することができます。
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 args = []; for(var i = 2; i <arguments.length; i ++){args.push(arguments [i]); } func.apply(object、args);} g(o、f、 'x squared ='、 '。すごい!');g()を呼び出すと、引数を配列に詰める代わりに、追加の引数をパラメーターとして渡すことができます。