コールは、適用され、バインド役割がある変更する機能を実行する際に、この時点。
あなたがnullにコンテキストを渡すか、未定義の場合は、ウィンドウオブジェクトは、デフォルトコンテキストである(デフォルトコンテキストがstrictモードで定義されていません)
関数が実行されている、3つのコールの方法があります。
メソッド呼び出しモード
VAR A = 1 VAR OBJ1 = { : 2 、 FN:関数(){ にconsole.log(この.A) } } obj1.fn()// 2
これは、オブジェクトOBJ1、obj1.fn()
実際にobj1.fn.call(obj1);
関数呼び出しモード
VAR A = 1 VAR OBJ1 = { : 2 、 FN:関数(){ にconsole.log(この.A) } } VAR FN1 = obj1.fn FN1()// 1
function(){console.log(this.a)}
、その関数は、呼び出しのいずれかの変更を加えることなく、この時間をFN1
function(){console.log(this.a)}.call(undefined)
setTimeout(関数(){ にconsole.log(本)// ウィンドウ 関数FN(){ にconsole.log(本)// ウィンドウ } FN() }、 0);
コンストラクタの呼び出しモード
ときに密かに新しいオブジェクトプロトタイプに接続されているメンバーを作成する新しい機能が、これは新しいオブジェクトにバインドされます
機能人(名前、年齢){ // ここでは、この時点インスタンスを この .nameのは= 名前 この .age = 年齢 この .sayAge = 機能(){ はconsole.log(この.age) } } VAR DOT = 新しい新しい(人を'ドット'、2 ) dot.sayAge()// 2
上記の3つの方法を理解することができます
obj1.fn() obj1.fn.call(OBJ1); //点現在のオブジェクトに FN1() fn1.call(NULL )//点ウィンドウオブジェクトに F1(F2) f1.call(ヌル、F2)は//点新たな目標へ
コール
最初のメソッド呼び出しは、このパラメータの値が結合されるべきであり、入ってくるは、パラメータのリストが続きます。最初の引数がnullの場合は、未定義、およびデフォルトのウィンドウを指します。
VAR ARR = [1、2、3、89、46 ] VaRの最大値= Math.max.call(ヌル、ARR [0]、ARR [1]、ARR [2]、ARR [3]、ARR [4])// 89
それは理解することができます。
obj1.fn() obj1.fn.call(OBJ1)。 FN1() fn1.call(ヌル) F1(F2) f1.call(ヌル、F2)
例を見てください:
VAR OBJ = { メッセージ: '私の名前である:' } 関数のgetName(FirstNameとlastNameの){ にconsole.log(この .message +のfirstName + '' + lastNameの) } getName.call(OBJ、 'ドット'、 'ドルビー' )
適用します
適用は、最初のパラメータは、この値は、2番目のパラメータは、パラメータ・アレイであるに結合している、2つのパラメータを受け付けます。最初の引数がnullの場合は、未定義、およびデフォルトのウィンドウを指します。
VAR ARR = [1,2,3,89,46 ] のvar最大= Math.max.apply(ヌル、ARR)// 89
それは理解することができます。
obj1.fn() obj1.fn.apply(OBJ1)。 FN1() fn1.apply(ヌル) F1(F2) f1.apply(ヌル、F2)
実際には、適用され、コールの使用量はほぼ同じで、呼び出しの前に書かれていないことと同じように使用することができ、唯一の違いはということです:機能の必要性は、複数の変数を渡すときは、入力パラメータとして配列を受け入れるように適用することができ、コールが受け入れられます別の一連の変数。
例を見てください:
VAR OBJ = { メッセージ: '私の名前である:' } 関数のgetName(FirstNameとlastNameの){ にconsole.log(この .message +のfirstName + '' + lastNameの) } getName.apply(OBJ、[ 'ドット'、「ドルビー「])// 私の名前は次のとおりです。ドットドルビー
、コンテキストの関数としてオブジェクトobjを見ることができ、これはオブジェクトobjに機能のgetNameを指します。パラメータ、姓と名は、アレイ渡されたのgetName関数に配置されています。
呼び出しに()例ここでは、他のオブジェクトから借りメソッドを呼び出して適用するために使用することができます。
VAR PERSON1 = 関数(){ この .nameの= 'ドット' 。 } VAR PERSON2 = 関数(){ この .getname = 関数(){ にconsole.log(この.nameの)。 } Person1.call(本) } VARの人= 新しいPERSON2()。 person.getname(); // ドット
私たちが見ることができる以上のことから、PERSON2はPERSON1のgetNameメソッドで名前の外に出たオブジェクトの人物をインスタンス化。PERSON2に、Person1.callの役割(この)PERSON1はなく、このオブジェクトのオブジェクトを使用することであるので、PERSON2はPERSON2がPERSON1のプロパティとメソッドを継承等価である、PERSON1のすべての属性およびメソッドを有します。
実際には、どのような方法を使用するときのために、もつれません。あなたのパラメータは既に配列に存在する場合、引数は互いに、使用呼び出しの間何よりも散乱団体であれば、当然、適用されます。数値のセットで最大値を見つけるために、上記の例のように、もちろん、適用さ合理的です。
コールおよび最初のパラメータに類似しているが、この点で、二番目の引数から出発して受信したパラメータのリストです。関数戻り値を受信したバインドを使用してパラメータのリストであることを除いてバインド方法。
- 戻り値は、関数であるバインド
VAR OBJ = { 名: 'ドット' } 関数のprintName(){ はconsole.log(この.nameの) } VARドット= printName.bind(OBJ) はconsole.log(ドット)// 関数(){...} ドット() // ドット
バインド方法はすぐに実行されていませんが、コンテキスト後の関数が戻るには、これを変更します。こののprintNameの主な機能は、グローバルオブジェクトウィンドウに、まだポイントを変更されていません。