call、appy、bindの応用と違い

4505 ワード

call、appy、bindの役割は、関数の運転時のthisの方向を変えることであり、thisの使い方に関しては、前の記事JavaScriptの中のthisの4つの呼び出しパターンを読むことができます.
コール
    call方法の最初のパラメータは、thisに結合される値であり、後に入ってくるのはパラメータリストである.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
var arr = [1, 2, 3, 89, 46];
var max = Math.max.call(null, arr[0], arr[1], arr[2], arr[3], arr[4]);//89
理解できます.
obj1.fn(); 
obj1.fn.call(obj1);

fn1();
fn1.call(null);

f1(f2);
f1.call(null,f2);
一例を見てください
var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName + ' ' + lastName);
}

getName.call(obj, 'Dot', 'Dolby');
appy
    applyは二つのパラメータを受け取ります.最初のパラメータはthisに結合される値で、二つ目のパラメータはパラメータ配列です.最初のパラメータがnull、undefinedの場合、デフォルトはwindowを指します.
var arr = [1,2,3,89,46];
var max = Math.max.apply(null,arr);//89
理解できます.
obj1.fn();
obj1.fn.apply(obj1);

fn1();
fn1.apply(null);

f1(f2);
f1.apply(null,f2);
    前に書いたコールの使い方と似ていると思いますか?実際にはapplyとcallの使い方はほぼ同じです.唯一の違いは、関数が複数の変数を伝達する必要がある場合、appyは一つの配列をパラメータとして入力し、callは一連の単独変数を受け入れることです.一例を見てください
var obj = {
    message: 'My name is: '
}

function getName(firstName, lastName) {
    console.log(this.message + firstName + ' ' + lastName);
}

getName.apply(obj, ['Dot', 'Dolby']);// My name is: Dot Dolby
    Objは関数コンテキストのオブジェクトとして、関数get NameのthisがObjというオブジェクトを指していることがわかる.パラメータfirst NameとlastNameは、配列に入れてget Name関数に入る.
callとapplyは他のオブジェクトを借りる方法に用いることができます.ここではcall()を例とします.
var Person1  = function () {
    this.name = 'Dot';
}
var Person2 = function () {
    this.getname = function () {
        console.log(this.name);
    }
    Person1.call(this);
}
var person = new Person2();
person.getname();       // Dot
    上から私達はPerson 2の実用化された対象のpersonがgetname方法でPerson 1のnameを手に入れたのを見ました.Person 2では、Person 1.call(this)の役割は、thisオブジェクトの代わりにPerson 1のオブジェクトを使用するので、Person 2は、Person 1の属性と方法のすべてを持っています.Person 2がPerson 1の属性と方法を継承したのに相当します.
    いつどんな方法を使うべきですか?実は気にしなくてもいいです.あなたのパラメータがもともと一つの配列の中にあるなら、自然にapplyを使います.パラメータが乱れているなら、お互いの間に何の関係もないです.コールを使います.上のように一組の数の中で最大の値の例を探して、もちろんappyを使うのが合理的です.
ビッド
    callとよく似ていますが、最初のパラメータはthisの指向であり、2番目のパラメータからは受信パラメータのリストです.違いは、bind方法の戻り値は、関数およびbind受信のパラメータリストの使用である.
  • bitリターン値は、関数
  • である.
    var obj = {
        name: 'Dot'
    }
    
    function printName() {
        console.log(this.name);
    }
    
    var dot = printName.bind(obj)
    console.log(dot); // function () { … }
    dot();  // Dot
    
        bind方法はすぐには実行されず、コンテキストthisを変更した関数を返します.もとの関数printNameの中のthisは変えられていないで、依然として大域の対象windowを指します.
  • パラメータの使用
    function fn(a, b, c) {
        console.log(a, b, c);
    }
    var fn1 = fn.bind(null, 'Dot');
    
    fn('A', 'B', 'C');            // A B C
    fn1('A', 'B', 'C');           // Dot A B
    fn1('B', 'C');                // Dot B C
    fn.call(null, 'Dot');      // Dot undefined undefined
    
        面白い問題がありますが、もし連続して二回、或いは連続して三回なら出力の値は何ですか?このように:
    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(); //?
        答えは、期待の4と5ではなく、2回とも3を出力します.なぜなら、Javascriptでは、複数回bind()が無効になっているからです.より深いレベルの原因は、bind()の実装は、使用関数が内部で1つのcall/applyを包んだことに相当し、2番目のbind()は、もう1回のbind()を包むのに相当しますので、2回目以降のbindは有効になりません.
    callは2つ目以降のパラメータをfnメソッドとして実装していますが、fn 1メソッドの実装はbind中のパラメータに基づいて後の列にします.
     apply、call、bind比較
    では、apply、call、bindの3つを比べたら、何か違いがありますか?いつappy、callを使いますか?いつbindを使いますか?簡単な例:
    var obj = {
        x: 81,
    };
    
    var foo = {
        getX: function() {
            return this.x;
        }
    }
    
    console.log(foo.getX.bind(obj)());  //81
    console.log(foo.getX.call(obj));    //81
    console.log(foo.getX.apply(obj));   //81
        三つの出力は81ですが、bind()の使い方を注意してみてください.彼の後ろには括弧が多くなりました.
        つまり、文脈環境を変えたいなら、すぐに実行するのではなく、折り返し実行する場合に、bind()を使用するのが違いです.アプリ/callはすぐに関数を実行します.
    もう少しまとめてみます
  • appy、call、bindの3つは、関数を変更するためのthisオブジェクトの指向です.
  • appy、call、bindの3つの最初のパラメータはいずれもthisが指すオブジェクト、すなわち指定したいコンテキストです.
  • appy、call、bindの3つは、後続のパラメータを使用して参照することができます.
  • bit は、対応する関数を返します.後で起動しやすくなります.apply、callはすぐ呼び出します.
  •  
    参照 http://www.cnblogs.com/tylerdonet/p/4864116.html
            https://www.jianshu.com/p/bc541afad6ee