申請して、電話してください
JavaScriptでは、callとapplyが存在して、実行時にコンテキスト(コンテキスト)を変更します。言い換えれば、関数本文内のこの方向を変えることです。
JavaScriptの主な特徴は、関数に「定義コンテキスト」と「ランタイムコンテキスト」、「コンテキストを変更できる」という概念があることです。
最初に栗を手に入れましょう:
function fruits(){} fruits.prototype = {color: "red"、ea:function(){console.log( "my color is" + this.color);}} var apple = new Fruits; apple.say(); //私の色は赤ですしかし、オブジェクトバナナ= {color: "Yellow"}がある場合、そのためのSAYメソッドを再定義したくない場合は、CALLまたは適用によってAppleのSAYメソッドを使用できます。
Banana = {color: "Yellow"} apple.say.call(banana); //私の色はyellowapple.say.apply(banana)です。 //私の色は黄色ですしたがって、呼び出しと適用がこれを動的に変更するように見えることがわかります。オブジェクトに特定の方法がない場合(バナナにはこの栗にメソッドを述べていません)、他の方法(Appleにはこの栗に発言方法があります)は、呼び出しを使用するか、他のオブジェクトメソッドで操作するために適用できます。
適用と呼び出しの違い
応用と呼び出しの両方について、関数はまったく同じですが、パラメーターを受け入れる方法は異なります。たとえば、次のように定義された関数があります。
var func = function(arg1、arg2){};次のように呼び出すことができます。
func.call(this、arg1、arg2); func.apply(this、[arg1、arg2])
これが指定したいコンテキストである場合、任意のJavaScriptオブジェクト(JavaScriptのすべてがオブジェクトです)になり、呼び出しがパラメーターを順番に渡す必要があり、配列にパラメーターを配置する手段を適用する必要があります。
JavaScriptでは、関数のパラメーターの数が固定されていないため、該当する条件を言いたい場合は、パラメーターが明確にわかっている場合は通話を使用します。
わからない場合は、適用してからパラメーターを配列に押し込んで渡して渡します。パラメーターの数が不確実な場合は、関数内の引数の擬似配列を介してすべてのパラメーターを通過できます。
メモリを統合して深めるために、以下にいくつかの一般的な用途があります。
配列に追加
var array1 = [12、 "foo"、{name "Joe"}、-2458]; var array2 = ["doe"、555、100]; array.prototype.push.apply(array1、array2); / * array1値は[12、 "foo"、{name "joe"}、-2458、 "doe"、555、100] */配列内の最大値と最小値を取得します
var番号= [5、458、120、-215]; var maxinnumbers = math.max.apply(math、numbers)、// 458maxinnumbers = math.max.call(Math、5、458、120、-215); // 458
番号自体には最大メソッドがありませんが、数学にはそれがあるため、通話または適用でその方法を使用できます。
それが配列であるかどうかを確認します(toString()メソッドが書き換えられていない場合)
functionisArray(obj){return object.prototype.tostring.call(obj)=== '[object array]';}アレイメソッドを使用したクラス(擬似)アレイ
var domnodes = array.prototype.slice.call(document.getElementsByTagname( "*"));
JavaScriptには擬似アレイと呼ばれるオブジェクト構造があります。さらに特別なのは、議論のオブジェクトであり、NodeListオブジェクトを返すように、getelementsbytagname、document.childnodesなどを呼び出す人もいます。配列の下でプッシュ、ポップ、その他のメソッドを使用することはできません。
ただし、array.prototype.slice.callを長さの属性を持つオブジェクトを使用して実際の配列に変換して、ドムノードが配列の下にすべてのメソッドを適用できるようにすることができます。
深く理解して使用して、応用と呼び出しを使用してください
インタビューの質問を借りて、応募を理解し、より深く電話しましょう。
console.logメソッドをプロキシできるようにログメソッドを定義します。一般的な解決策は次のとおりです。
function log(msg){console.log(msg);} log(1); // 1log(1,2); // 1上記の方法は最も基本的なニーズを解決できますが、合格したパラメーターの数が不確かな場合、上記の方法は失敗します。現時点では、Applyまたは電話の使用を検討できます。ここで渡されるパラメーターの数は不確かであるため、適用するのが最善であることに注意してください。この方法は次のとおりです。
function log(){console.log.apply(console、arguments);}; log(1); // 1log(1,2); // 1 2次の要件は、次のような各ログメッセージに「(APP)」ドロップアウトを追加することです。
log( "hello world"); //(アプリ)Hello World
もっとエレガントにする方法は?この時点で、引数パラメーターは擬似アレイであると考える必要があります。これは、array.prototype.slice.callを介して標準配列に変換され、次のように配列メソッドUnshiftを使用します。
function log(){var args = array.prototype.slice.call(arguments); args.unshift( '(app)'); console.log.apply(console、args);};詳細な説明をバインドします
応募と電話について話した後、Bindについて話しましょう。 bind()メソッドは、適用および呼び出しに非常に似ており、関数本文でこれを指すことも変更できます。
MDNの説明は次のとおりです。BIND()メソッドは、結合関数と呼ばれる新しい関数を作成します。この結合関数が呼び出されると、結合関数は、これが作成されたときにbind()メソッドの最初のパラメーターと、bind()メソッドの2番目のパラメーターと、元の関数を呼び出すために元の関数のパラメーターとしてバインディング関数ランタイム自体のパラメーターと後続のパラメーターのパラメーターを使用します。
使用方法を見てみましょう。一般的なモノマーモードでは、通常、それ、自己などを使用して、これを保存して、コンテキストを変更した後も参照し続けることができます。このような:
var foo = {bar:1、eventbind:function(){var _this = this; $('。someclass ')。on(' click '、function(event){/ * act on the event */console.log(_this.bar);/1});}}}}JavaScript固有のメカニズムにより、コンテキスト環境はeventBind:function(){} {} {}('。someclass ')に変更されました。これを保存するために変数を使用する上記の方法は有用であり、問題はありません。もちろん、bind()を使用すると、この問題をよりエレガントに解決できます。
var foo = {bar:1、eventbind:function(){$('。someclass ')。on(' click '、function(event){/ * act on the event */console.log(this.bar); //1} .bind(this));}}}}上記のコードでは、bind()は関数を作成します。このクリックイベントが呼び出されると、そのキーワードは渡された値に設定されます(ここでは、bind()が呼び出されたときに渡されたパラメーターを指します)。したがって、ここでは、目的のコンテキストでbind()関数に渡されます。次に、コールバック関数が実行されると、これはFOOオブジェクトを指します。別のシンプルな栗:
var bar = function(){console.log(this.x);} var foo = {x:3} bar(); // undefinedvar func = bar.bind(foo); func(); // 3ここでは、新しい関数FUNCを作成します。 bind()を使用してバインディング関数を作成する場合、実行されると、これはbar()を呼び出すときのようにグローバルな範囲ではなく、fooに設定されます。
興味深い質問があります。 bind()が2回連続である場合、またはbind()が3回連続である場合、出力値は何ですか?このような:
var bar = function(){console.log(this.x);} var foo = {x:3} var sed = {x:4} var func = bar.bind(foo).bind(sed); func(); //?var fiv = {x:5} var func = bar.bind(foo).bind(sed).bind(fiv); func(); //?var fiv = {x:5} var func = bar.bind(foo).bind(sed).bind(fiv); func(); //?答えは、両方の時間が予想される4と5の代わりに3出力3になるということです。その理由は、JavaScriptでは、Bind()が無効であることです。より深い理由で、bind()の実装は、関数を使用してコール /内部で適用することと同等です。 2番目のbind()は、最初のbind()を再びラッピングするのと同等であるため、2回目のバインドは有効になりません。
適用、呼び出し、比較を結合します
では、Apply、Call、Bindの違いと違いは何ですか?使用するタイミングを適用して、呼び出し、バインドを使用するタイミング。シンプルな栗:
var obj = {x:81、}; var foo = {getx:function(){return this.x;}} console.log(foo.getx.bind(obj)()); //81Console.log(foo.getx.call(obj)); //81Console.log(foo.getx.apply(obj)); //81Console.log(foo.getx.apply(obj)); //81Console.log(foo.getx.apply(obj)); // 813つの出力はすべて81ですが、Bind()メソッドを使用したものに注意を払ってください。
つまり、違いは、コンテキストを変更する場合、すぐに実行するのではなく、コールバック、bind()メソッドを使用することです。 apply/callは、すぐに関数を実行します。
もう一度要約しましょう:
•適用、呼び出し、バインドはすべて、関数のこのオブジェクトの指さしを変更するために使用されます。
•適用、呼び出し、およびバインドの最初のパラメーターは、これが指摘したいオブジェクト、つまり、指定したいコンテキストです。
•適用、呼び出し、およびバインドはすべて、後続のパラメーターを使用してパラメーターを渡すことができます。
•BINDは、対応する関数を返します。これは後で簡単に呼び出すことができます。応募と電話はすぐに呼び出されます。
上記は、編集者が紹介したJavaScriptでApply、Call、Bindの巧妙な使用です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!