Javascriptにおけるcallとappyの理解


Javascriptでは、各関数は2つの非継承法を含んでいます.callapply.これらの2つの方法の用途はいずれも特定の作用領域で関数を呼び出すものであり、実際には関数の内部を設定するものと同じである.thisオブジェクトの値.
「JavaScript高級プログラム設計」から抜粋する.apply方法は、2つのパラメータを受信し、最初のパラメータは、動作関数の作用領域であり、2番目はパラメータ配列またはargmentsオブジェクトである.call方法はapply方法と同じ作用を持ち、第一のパラメータも同じであり、他のパラメータは個別にリストする必要があるという点で異なる.
apply(thisArg, argArray);
call(thisArg[,arg1,arg2…]);
callを使うか、それともapplyを使うかは、具体的な状況を見なければなりません.すべてのパラメータまたはパラメータの数が少ないと知っているなら、callを使用してもいいです.パラメータの数が不確定な場合、または大きな数の場合、または1つの配列またはargmentsオブジェクトを受信する場合は、applyを使用する必要があります.
以下はappyを使用したいくつかの典型的な例です.
//           
var arr = [1, 8, 10, 3, 24, 89, 26];
var m = Math.max.apply(Math, arr); // m => 89

//            
var arr = Array.prototype.slice.call(arguments);
実際には、callおよびapplyの真の使用場所は、彼らが機能を拡張して機能を実行することができるスコープである.
私たちはまた次の例を見に来ます.

var name = 'out'

var o1 = {
    name: 'hello'
};

var o2 = {
    name: 'world'
};

function sayName() {
    alert(this.name);
}

sayName.call(this); // out
sayName.call(window); // out
sayName.call(o1); // hello
sayName.call(o2); // world
前の二つの出力は同じです.グローバルスコープでは、thisはwindow(ブラウザ環境)です.残りの二つは、それぞれの実行環境を変えて、それぞれo 1とo 2を指しています.結果として、対象のそれぞれのname値が表示されます.
じゃ、コールとアプリを使うとどんなメリットがありますか?同じ関数で、異なる実行環境を指定すると、異なる結果が発生することを発見しました.
callとapplyを使うと、関数とオブジェクトは強い依存関係がなく、複数のオブジェクトは同じ関数を使用して、資源の浪費を避けられます.また、モジュール化プログラミングにも大いに役立ちます.
callとappyに対してまだはっきりした認識がないなら、このように理解してみてもいいです.私たちは方法を道具に例えます.例えばナイフです.変数は具体的な実物で、例えばリンゴです.私たちはこのナイフを使ってリンゴをたくさん切ってもいいです.リンゴを切る過程で、実際に刀の作用の対象を変えました.
上の例では
//            
var arr = Array.prototype.slice.call(arguments);
sliceは方法ですが、Arayオブジェクトのプロトタイプの属性のすべてに属しています.argmentsを使用する時には、借用として理解できます.例えば、張三は木を切ることができます.つまり、張三は という方法があります.李四は木を持っていますが、切ることはできません.この時、李四は張三の木を切る方法を借りて自分の木を切って、コードと書きます.
var zhangsan = {
   cut: function() {
        alert(this.tree);
   }
};

var lisi = {
    tree: '  '
};
zhangsan.cut.call(lisi); // alert('  ')
もう一つのケースは、李四自身も木を切ることができますが、ある日彼は病気になり、切れなくなりました.この時、彼も張三の木の切り方を借りて自分の木を切ることができます.コードの中には
String.prototype.toString = function() {
    return 'shit'; //    String      toString       ,    'shit'
};

var str = 'hello';

console.log(str.toString()); // 'shit'
//        ?
//             toString       ,  Object(  Array   String    )
console.log(Object.prototype.toString.call(str)); //      '[object String]'
ここに来たら、callとappyに対してもうイメージを持っていると思います.これからも似たような問題があったら、現実の関係を想像してみてください.長い間悩んでいた問題が急に明るくなりました.
callとapplyのもう一つの応用は関数のコリック化とアンチコリック化の技術です.興味があるのは次の二つの文章を見ることができます.Javascriptの中の面白いアンチコリック化の技術はJavaScriptのアンチコリック化によって考えられます.