JavaScript中call,appyとbind

7131 ワード

call and appy   関数内部のthisの指向(すなわち関数実行時の作用領域)を変更し、指定された作用領域で関数を呼び出します.
function test() {} 
test() == test.call()

var obj ={};
Object.prototype.toString.call(obj) //"[object Object]"
//  call   apply       this       
        obj.toString() 
1.callとappyの違いは、参加にあります.
  • callの第二のパラメータは、単一のパラメータ
  • から始まります.
  • appyの2番目のパラメータは、配列またはクラス
  • である.
    var a = [1, 2, 4, 1, 15];
    Math.max.apply(null, a) // 15
    
    Math.max.call(null,  1, 2, 4, 16, 15) // 16
    
    //         undefined
    
    Array.apply(null [1,,3,,4) //[1,undefined,3,undefined,4];
      最初のパラメータが空、null、undefinedであると、デフォルトではグローバルオブジェクトに入ります.
     
    2.空の要素とundefinedの違い
  • 配列のforEach方法は空の要素をスキップしますが、undefinedはスキップされません.したがって、内部要素を遍歴すると、異なる結果が得られます.
  • 3.類似配列のオブジェクトを変換する
  • によって処理されるオブジェクトには、length属性と対応する数字キーが必要である.
  • let obj = { 0: 1, length: 2 };
    let obj1={ 0: 1,1: 2, length: 2 };
    
    Array.protetype.slice.apply(obj);//[1,undefined]
    
    Array.protetype.slice.apply(obj1);//[1,2]
     bindメソッド
    関数内のthisをオブジェクトに結合し、新しい関数を返します.
    var counter = {
    count: 0,
    a: function () {
    this.count++;
       }
    };
    
    var func = counter.a.bind(counter);
        func();
      counter.count // 1
    
      var add = function (x, y) {
       return x * this.m + y * this.n;
      }
    
     var obj = {
         m: 2,
         n: 2
      };
    
    var newAdd = add.bind(obj, 5); // x     5 
    newAdd(5) // 20
    newAdd(1,5)//12
      最初のパラメータはnullまたはundefinedで、thisをグローバルオブジェクトに結びつけるのと同じです.  
    bindメソッド使用上の注意点
  • bind方法は、1回実行するごとに、新しい関数を返します.1つの変数受信
  • が必要です.
  • は、コールバック関数と組み合わせて
  • を使用する.
    var counter = {
        count: 0,
        inc: function () {
            'use strict';
            this.count++;
        }
    };
    
    function callIt(callback) {
        callback();
    }
    
    callIt(counter.inc.bind(counter));
    counter.count // 1
     
     コール方法と組み合わせて使う
    1.普通にsliceを使う
     [1, 2, 3].slice(0, 2) // [1,2]
    //    
    Array.prototype.slice.call([1, 2, 3], 0, 2) // [1,2]
     2.アラy.prototype.sliceをFuntions.prototype.calメソッドの対象に変更し、呼び出し時にアラy.prototype.slice.calになります.
    var slice = Function.prototype.call.bind(Array.prototype.slice);
    Function.prototype.slice.call([1, 2, 3], 0, 1) // [1]
    //slice([1, 2, 3], 0, 1) 
     
    3.類似の書き方は他の配列方法にも使用できます.
    var push = Function.prototype.call.bind(Array.prototype.push);
    var pop = Function.prototype.call.bind(Array.prototype.pop);
    
    var a = [1 ,2 ,3];
    push(a, 4)
    a // [1, 2, 3, 4]
    
    pop(a)
    a // [1, 2, 3]
     
    4.Funtions.prototype.bind方法をFuntions.prototype.callにする方法は、bindの呼び出し形式も書き換えられます.
    function f() {
    console.log(this.v);
    }
    
    var o = { v: 123 };
    var bind = Function.prototype.call.bind(Function.prototype.bind);
    bind(f, o)() // 123