入門
プロトタイプのJS、各機能の点でFunction.prototype(JSプロトタイプベースの継承チェーン)オブジェクト。そのため、各関数は、関数から継承され、コール、およびバインドメソッドを適用しています。
彼らの役割は同じで、このポイントの機能を変更するために使用されています。
使用
使用法を適用することとして表すことができる:
A.apply(B、[X、Y、Z]);
このメソッドは、ポイントBに、関数Aに関数をこの点を変更してもよいです 第二のパラメータは、関数パラメータリストの配列の形で送られます。
コールの使用状況とは異なる方法でほとんど唯一の質量の参加を適用します。このように:
A.apply(B、X、Y、Z)は
別複数のパラメータを渡すことはなく、それを適用することができ、全てのパラメータが配列に来るように内部通過するのに必要。
同じようにバインド質量参加と呼びますが、違いは、直後メソッド呼び出しと呼び出しを適用実施し、その後、メソッド呼び出しをバインドされるということですが、新しい関数を返し、それはすぐに実行されることはありません、我々は手動でする必要があり実行。
例えば
var name = "佚名";
var age = 20;
//global.name
//global.age
var p1 = {
name: "张三",
age: 12,
func: function(){
console.log(`姓名:${this.name},年龄:${this.age}`)
}
}
var p2 = {
name: "李四",
age: 15
}
p1.func(); //姓名:张三,年龄:12
p1.func.call(); //姓名:佚名,年龄:20
p1.func.apply(p2); //姓名:李四,年龄:15
p1.func.bind(p2)(); //姓名:李四,年龄:15
- ダイレクトコールp1.func方法、現在のオブジェクトP1にこのポイントは、その名前と年齢は、オブジェクト自体のそのプロパティ値のとき。
- ノード環境では、この点グローバル;メソッド呼び出しを使用する場合、最初のパラメータを渡すことは、ヌル、ブラウザ環境では、この点のウィンドウです。読者は、名前と年齢global.nameを変更し、検証global.ageは自由です。
- 方法が適用使用する場合、目標点P2に、P2には、この関数の対応を通過し、したがって、プロパティのプロパティは、この時間印刷物P2であります
- バインドメソッドは、手動で(すなわち、機能の実行の最後に括弧を追加します)どのような機能を実行する必要がある、新しい関数オブジェクトを生成します。
概要
完成し、コールの例としては、適用し、バインドの違いは非常に明確になっています。それは、この文脈の存在を変更することです。だから、時にはあなたは、このような使用法が表示されます。この時点への変更をしないと、次のように、バインド(これを)再度追加正常に機能します
function f(){}.bind(this)
この場合は、この時点で不可解な問題が表示されません。私はこの関数を呼び出したいとき明らかに関数内のオブジェクトのプロパティに属しているが、これはなぜそれを訪問しません。(Jsの書き込み初心者は確かに、このような問題が発生します)
実際には、ES6初めから、我々は矢印機能をサポートしてきました、私はあなたが矢印の機能を使用することを示唆し、問題へのこのポイントは表示されません。
また、コールの使用は、機能の継承にも適用されます。ES6クラスが表示されない前に、私たちは、継承を実装するためにそれらを支援する必要があります。