javascriptの中のapply()とcall()の方法は詳しく説明します.
5315 ワード
1、文法はまずJSマニュアルの中のコールに対する説明を見にきます.
コール方法は、オブジェクトを別のオブジェクトに置き換える方法を呼び出します.
2、使い方
functionも対象ですので、各関数には引き継ぎではない2つの方法が含まれています.これらの2つの方法の用途はいずれも特定の作用領域で関数を呼び出すものであり、実際には関数の内部のthisオブジェクトを設定する値に等しい.まず、appy()方法は、2つのパラメータを受信する.1つは、機能を実行するスコープ、もう1つはパラメータ配列である.ここで、第二のパラメータは、Arayの例であっても良いし、argmentsオブジェクトであっても良い.たとえば:
厳密なモードでは、環境オブジェクトを指定せずに関数を呼び出すと、this値はwindowに変換されません.特定のオブジェクトに関数を追加するか、またはappy()またはcall()を呼び出しないと、this値はundefinedとなります.
3、異なる点
call()方法とappy()方法の役割は同じで、それらの違いは、受信パラメータの方式が異なるだけである.call()法に対して,最初のパラメータはthis値に変化がなく,残りのパラメータは直接関数に伝達される.つまり、コール()方法を使用する場合、関数に渡すパラメータは、次の例に示すように、一つ一つ列挙しなければなりません.
4、関数運転のスコープを拡張する
実際には、伝達パラメータはapply()とcall()が本当に使う場所ではない.それらが本当に強いところは、関数を拡張して実行できるスコープです.次の例を見ます.
前の例の最初のバージョンでは、まずsayColor関数をオブジェクトoに置いてから、oで呼び出します.ここで書き換えた例では、前の余分なステップは不要です.
5、ビン()の方法
ECMAScript 5はまた、方法を定義しています.この方法は、ビッド関数に伝える値に結合される関数の例を作成します.たとえば:
Bind()メソッドをサポートするブラウザには、IE 9+、Firefox 4+、Safari 5.1+、Opera 12+、Chromeがあります.
コール方法は、オブジェクトを別のオブジェクトに置き換える方法を呼び出します.
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
パラメータthisObj 。 。
arg1, arg2, , arg 。 。
コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる. thisObj , Global thisObj。
白点とは、オブジェクトの内部ポインタを変更すること、オブジェクトのthisの方向を変更することです.これはオブジェクト指向のjsプログラミングの過程で時々有用である.2、使い方
functionも対象ですので、各関数には引き継ぎではない2つの方法が含まれています.これらの2つの方法の用途はいずれも特定の作用領域で関数を呼び出すものであり、実際には関数の内部のthisオブジェクトを設定する値に等しい.まず、appy()方法は、2つのパラメータを受信する.1つは、機能を実行するスコープ、もう1つはパラメータ配列である.ここで、第二のパラメータは、Arayの例であっても良いし、argmentsオブジェクトであっても良い.たとえば:
function sum(num1, num2){
return num1 + num2;
}
function callSum1(num1, num2){
return sum.apply(this, arguments); // arguments
}
function callSum2(num1, num2){
return sum.apply(this, [num1, num2]); //
}
alert(callSum1(10,10)); //20
alert(callSum2(10,10)); //20
上記の例では、コールSum 1()は、sum()関数を実行する際に、this値(グローバルスコープで呼び出されたので、伝わってきたのがwindowオブジェクト)とargmentsオブジェクトとして伝えられています.call Sum 2もsum()関数を呼び出しましたが、それが入ってきたのはthisとパラメータ配列です.この二つの関数は正常に実行され、正しい結果を返します.厳密なモードでは、環境オブジェクトを指定せずに関数を呼び出すと、this値はwindowに変換されません.特定のオブジェクトに関数を追加するか、またはappy()またはcall()を呼び出しないと、this値はundefinedとなります.
3、異なる点
call()方法とappy()方法の役割は同じで、それらの違いは、受信パラメータの方式が異なるだけである.call()法に対して,最初のパラメータはthis値に変化がなく,残りのパラメータは直接関数に伝達される.つまり、コール()方法を使用する場合、関数に渡すパラメータは、次の例に示すように、一つ一つ列挙しなければなりません.
function sum(num1, num2){
return num1 + num2;
}
function callSum(num1, num2){
return sum.call(this, num1, num2);
}
alert(callSum(10,10)); //20
call()方法を使用する場合、calSum()は各パラメータに明確に入ってきなければならない.結局、アプリを使うのと同じです.アプリを使うか、それともコールを使うかは、どの関数を使ってパラメータを伝えるかによって決まります.直接argmentsオブジェクトに入るつもりか、関数を含めて最初に受信したのも行列です.そうでなければ、call()を選んだほうがいいかもしれません.(関数にパラメータを渡さない場合、どの方法を使っても構いません.)4、関数運転のスコープを拡張する
実際には、伝達パラメータはapply()とcall()が本当に使う場所ではない.それらが本当に強いところは、関数を拡張して実行できるスコープです.次の例を見ます.
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColor.call(o); //blue
この例は、前に述べたthisオブジェクトの例をもとに修正されたものです.今回は、sayColor()も大域関数として定義されています.また、グローバルスコープで呼び出した場合、「red」が確実に表示されます.sayColor.call(this)とsayColor.call(window)は、両方の明示的にグローバルスコープで関数を呼び出す方式で、結果はもちろん「red」が表示されます.しかし、sayColor.call(o)を実行すると、関数の実行環境が違ってきます.この時、関数の体内のthisオブジェクトがoを指していたので、結果は「blue」です.call()(またはappy()を使用して、作用領域を拡張する最大の利点は、オブジェクトが方法との結合関係を必要としないことである.前の例の最初のバージョンでは、まずsayColor関数をオブジェクトoに置いてから、oで呼び出します.ここで書き換えた例では、前の余分なステップは不要です.
5、ビン()の方法
ECMAScript 5はまた、方法を定義しています.この方法は、ビッド関数に伝える値に結合される関数の例を作成します.たとえば:
window.color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
ここでは、sayColor()がbind()を呼び出してオブジェクトoに入り、object SayColor()関数を作成します.object-SeayColor関数のthis値はoに等しいので、グローバルスコープでこの関数を呼び出しても「blue」が見られます.Bind()メソッドをサポートするブラウザには、IE 9+、Firefox 4+、Safari 5.1+、Opera 12+、Chromeがあります.