JavaScriptの構文は柔軟であり、同じ関数の5つまたは6つの実装方法を持つことは珍しくありません。私はしばしばコールと応募の違いを理解していないので、今日それを忘れないように今日それを記録します。
JavaScriptでは、次の方法でメソッドを実行できます。
1.FUNC()は、最も直接的で一般的な呼び出し方法であり、普通の人々の思考論理にも準拠していますが、場合によってはいくつかの欠点があります。
2.(function(arg){})(ウィンドウ)、匿名のメソッド呼び出しは、次のブラケットのパラメーターを匿名のメソッドの着信パラメーターに1つずつ構築するときに、より便利です。
3.FUNC.BIND(STH)()は、BINDがECMA-262 5th Editionで追加されていることです。
4.func.call()、これは、現在のメソッドを実行するためにプロトタイプで定義されたコールメソッドを呼び出す2番目の方法です。
5.Func.Apply()、Call's Twin Brother。
func()
これは最も一般的な呼び出しの方法であり、あらゆる言語のどこでも見ることができます。 FUNC(x、y)は、異なるパラメーターを渡すことができます。 PHP、Javaなどの一部の言語では、この種の呼び出しはすべての問題を解決するのに十分です。しかし、JavaScriptは機能的な言語であり、閉鎖の概念と奇妙なキーワードであり、これによりこの呼び出し方法の欠点が決定されます。これは、現在のコードセグメントの範囲として解釈する必要があります。これは、コードが異なるフラグメントに実行されると変更されます。
コードコピーは次のとおりです。
var a = {};
var func = function(x){
console.log(this);
};
a.onclick = function(){
var x = 100;
func(x);
};
a.onclick();
ページのリンクと考えることができます。これは、定義されたメソッドをすぐに呼び出すのではなく、OnClickイベントにバインドするだけなので、匿名のメソッドで締め切り、aのオンクリックイベントに渡す必要があります。これには、これがfuncでグローバルオブジェクトウィンドウになります。現時点では、func()を直接コールメソッドとして使用することは不可能であるため、FUNCの外側にFUNCメソッドに結合する必要があります。したがって、バインド、呼び出し、適用方法があります。
バインド
バインドの目的は非常にシンプルで、このオブジェクトをバインドするのと同じ方法を返します。上記のコードは、1つの行を変更することにより、Aオブジェクトにこれをバインドする目的を達成できます。
コードコピーは次のとおりです。
var a = {};
var func = function(x){
console.log(this);
};
a.onclick = function(){
var x = 100;
func.bind(this)(x);
};
a.onclick();
このようにして、このオンクリックイベントはヘッドレスフライのように走り回られません。
電話して応募してください
それらは非常に似ているので、電話と応用について一緒に話し合う必要があります。これらはすべて複数のパラメーターをサポートしており、最初のパラメーターはバインドされるこのオブジェクトであり、2番目のパラメーターはその違いを呼び出しパラメーターとして使用し、[アレイ]を呼び出しパラメーターとして使用します。このオブジェクトを変更したくない場合がありますが、この時点で人工的にバインドしたいと考えています。 (Bindを使用できないというわけではありませんが、Bindが遅れて表示されるように思われるため、ブラウザの互換性が低下する可能性があります)。栗を取る:
コードコピーは次のとおりです。
a = {
func:function(){
this.x += 1;
}、
X:0
};
b = {
A:A、
X:20
};
for(var i = 0; i <10; i ++){
bafunc();
}
console.log(ax);
console.log(bx);
上記のAおよびBオブジェクトにはXがあります。FUNCは、対応するXをターゲットを絞った方法で変更できることを願っていますが、直接コールはFUNCスコープ、つまりAXのみを変更できます。コードを変更して、BXを変更する目的を達成する
コードコピーは次のとおりです。
a = {
func:function(){
this.x += 1;
}、
X:0
};
b = {
A:A、
X:20
};
for(var i = 0; i <10; i ++){
bafunc.call(b);
}
console.log(ax);
console.log(bx);
この栗は好評ではなく、該当するシナリオを備えた非常に紛らわしいコードスタイルですが、どこでも利用できません。