JavaScriptでは、このポインティングは動的に変更されており、このポインティングがプログラムを作成するプロセス中に誤って破壊される可能性が非常に高いです。したがって、これの意味を修正できるテクノロジーが必要なため、関数には「定義コンテキスト」、「ランタイムコンテキスト」、「コンテキストを変更できる」という概念を持っているため、コール、適用、および拘束力のあるメソッドが関数本文内の指さしを変更します。
申請して、電話してください
適用:特定のオブジェクトの1つの方法を適用し、現在のオブジェクトを別のオブジェクトに置き換えます
通話:現在のオブジェクトを別のオブジェクトに置き換えるためにオブジェクトのメソッドを呼び出す
function person(){} person.prototype = {attr:{age:18、sex: 'girl'}、ea:function(){console.log( "my age is" + this.attr.age); console.log( "i a a" + this.attr.sex); }} var marry = new person(); marry.say(); //私の年齢は18歳です//私は女の子です方向を変えます
function person(){} person.prototype = {attr:{age:18、sex: 'girl'}、ea:function(){console.log( "my age is" + this.attr.age); console.log( "i a a" + this.attr.sex); }} xiaoming = {attr:{age:20、sex: 'boy'}}}; var marry = new person(); marry.say(); marry.say.call(xiaoming); //私の年齢は18 //私は女の子です//私の年齢は20 //私は男の子です何が一般的です
両方を使用して、別のオブジェクトの代わりにメソッドを呼び出すことができ、関数のオブジェクトコンテキストを初期コンテキストからthatOBJによって指定された新しいオブジェクトに変更できます。
違い
1。適用:せいぜい2つのパラメーターしか存在できません。新しいオブジェクトとアレイアラレイです。この方法に複数のパラメーターを渡す場合は、すべてのパラメーターをこの配列に書き込みます。もちろん、パラメーターが1つしかない場合でも、配列に書き込まれる必要があります。 ArgArrayが有効な配列ではない場合、または引数オブジェクトではない場合、TypeRrorが生成されます。引数が提供されていない場合、グローバルオブジェクトはthisOBJとして使用され、引数を渡すことはできません。
fun.call(thisarg [、arg1 [、arg2 [、...]]])関数f(x、y){console.log(x+y);} f.call(null、1、1)// return 2 22。呼び出し:これは、JSオブジェクトのさまざまな方法が相互に呼び出される場合に主に使用される直接パラメーターリストであるため、現在のポインターが一貫しているか、特別な場合、このポインターを変更する必要があります。 thisOBJパラメーターが提供されていない場合、グローバルオブジェクトはthatoBJとして使用されます。
fun.apply(thisarg、[argsarray])関数f(x、y){console.log(x+y);} f.call(null、[1,1])// return 2適用は、コール関数と同じですが、着信パラメーターリストの形式が異なることを除きます。 Thisargは、指定したいコンテキストです。任意のJavaScriptオブジェクト(JavaScriptのすべてがオブジェクトです)にすることができます。呼び出しはパラメーターを順番に渡す必要がありますが、Applyは配列にパラメーターを入れます。
関数のパラメーターの数が固定されていない場合は、パラメーターが数量を明確に知っている場合は呼び出しを使用し、不確かなときに適用し、パラメーターを配列に押し込み、パラメーターの数が不確かな場合、関数はすべてのパラメーターを引数配列を通過することもできます。いくつかの使用法を見てみましょう
コード1
var array1 = [12、 "foo"、{name: "joe"}、-2458]; var array2 = ["doe"、555、100]; array.prototype.push.apply(array2); console.log(array1); // [12、 "foo"、foo "、foo"、foo "、foo、-2458、100、"コード2
var番号= [5、458、120、-215]; math.max.apply(null、numbers); // 458
コード3
log(12、 "foo"、{name: "joe"}、-2458); function log(){var args = array.prototype.slice.call(arguments); args.unshift( '(app)'); console.log.apply(console、args);}; //(app)12 foo object {name: "joe"} -2458バインド
fun.bind(thisarg [、arg1 [、arg2 [、...]]]])
上記とは異なり、BINDはこのポインティングを変更する新しい関数を返します。ここでは新しい関数が強調されていることに注意してください。これは以前に使用したメモリアドレスと同じメモリアドレスではないため、この関数を再利用する必要がある場合は、次の呼び出しを容易にするために変数に保存する必要があります。上記の2つの関数は、返された実行結果、つまりコールが実行されることです。
さらに、もう1つに注意すべきことは、Bind関数の最初のパラメーターが、新しい関数のパラメーターを返すためのデフォルト値に自動的に値になることです。次に、公式の呼び出しが呼び出された場合、最初のパラメーターを除いて残りのパラメーターを指定する必要があります。
関数f(x、y){console.log(x+y);} f.call(null、[1,1])var new_f = f.bind(null、1,1)// new functionnew_f(1)// return 2 return 2 2上記のすべての例コードのthisargパラメーターは、nullに置き換えられていることに注意してください。 thisargオブジェクトが指定されていない場合、このポインティングはnullの下でのグローバルオブジェクトです。つまり、JSコード実行環境です
適用、呼び出し、比較を結合します
var obj = {bar: 'oops、これは悪い考えです'}; var foo = {get:function(){return this.bar; }} var bind = foo.get.bind(obj)、call = foo.get.call(obj)、apply = foo.get.apply(obj); console.log(bind()、call、apply); console.log(bind、call、apply); console.log(typeof bind、typeof call、typeof apply); console.log(typeof bind()、typeof call、typeof apply);違いはありません。違いは、コンテキストを変更したい場合、すぐに実行されないが、コールバックが実行され、bind()メソッドを使用することです。 Apply/Callはすぐに関数を実行します
適用、呼び出し、バインドはすべて、関数のこのオブジェクトの指さしを変更するために使用されます。 Apply、Call、Bindの最初のパラメーターはすべて、これが指すはずのオブジェクト、つまり指定されるコンテキストです。適用、呼び出し、バインドはすべて、後続のパラメーターを使用してパラメーターを渡すことができます。 Bindは、後で呼び出すのに便利な対応する関数を返します。適用すると、電話がすぐに呼び出されます
上記の記事は、JavaScriptの呼び出し、適用、およびバインドメソッドの違いを深く理解しています。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。