JavaScript:関数の2つの非継承方法apply()、call()、およびES 5のbind()

1144 ワード

このcall()、appy()の2つの方法は同じ役割をしています.呼び出したい関数を変更するためのスコープです.それらの違いはパラメータの受け取り方です.bing()の役割は結合作用ドメインである.
  • appy()は2つのパラメータを受け入れる.最初のパラメータは、スコープです.第二のパラメータは、Arayに導入された要素は、呼び出される関数のパラメータであり、また、直接にアーグメンントオブジェクトを伝えることができる
  • である.
    function sum(num1, num2){
        return num1 + num2;
    }
    function callSum(num1, num2){
    return sum.apply(this, [num1, num2]);
    //or
    //return sum.apply(this, arguments);
    }
    
  • call()は、appyとは違って、第二のパラメータの開始であり、彼はArayに入るのではなく、パラメータを一つずつ列記する、すなわちcallのパラメータは一定ではない.
  • function callSum(num1, num2){
        return sum.call(this, num1, num2);
    }
    
    PS:上の例でも入ってきた作用域はthisですが、この二つのcalSum関数は全体的な作用領域で呼び出されます.つまり、thisオブジェクトはwindowです.
    window.color = "red";
    var obj = { color: "blue" };
    function sayColor(){
        console.log(this.color);
    }
    
    sayColor.call(this);    //red
    sayColor.call(window);  //red
    sayColor.call(obj);     //blue
    
    上記の例でも、call()とappy()の方法が一番大きいかどうかが分かりますが、関数を変えて実行する作用領域です.
  • bind()
  • var temp = sayColor.bind(obj);
    temp();  //blue
    
    注意したいのは、bind()メソッドをサポートするブラウザには、IE 9+、Firefox 4+、Safari 5.1+、Opera 12+、Chromeがあります.