[JS]JavaScriptのapplyとcallの用法の意味と違いについて(転)

3745 ワード

javascriptにはcallapplyの方法があります.その役割は基本的に同じですが、少し違いがあります.まず、JSマニュアルのcallapplyの解釈を見てみよう.
メソッドの定義
  • call方法:シンタックス:call([thisObj],arg 1[,arg 2]])定義:オブジェクトを呼び出す一つの方法で、現在のオブジェクトを別のオブジェクトに置き換える.説明:コール方法は、他のオブジェクトの代わりに一つの方法を呼び出すために使用されてもよい.call方法は、関数のオブジェクトコンテキストを初期のコンテキストから、thisObjによって指定された新しいオブジェクトに変更することができる.thisObjパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用される.
  • appy方法:構文:appy([thisObj],argAray])定義:あるオブジェクトを適用する方法で、現在のオブジェクトを別のオブジェクトに置き換える.説明:もしargArayが有効な配列ではないか、またはargmentsオブジェクトではないなら、TypeErrorを引き起こすことになります.argArayおよびthisObjのいずれかのパラメータが提供されていない場合、GlobalオブジェクトはthisObjとして使用され、任意のパラメータを伝達することができない.
  • ホワイトポイントとは、オブジェクトの内部ポインタを変更すること、すなわちオブジェクトを変更するthisの指す内容である.これはオブジェクト指向のjsプログラミングの過程で時々有用である.ネット上のコードの部分を引用して、運行後自然にその道理が分かります.
    
        
      function Obj(){this.value="  !";}    
      var value="global   ";    
      function Fun1(){alert(this.value);}    
      window.Fun1();   //global      
      Fun1.call(window);  //global       
      Fun1.call(document.getElementById('myText'));  //input text    
      Fun1.call(new Obj());   //  !
    
    
    call関数およびapply方法の最初のパラメータは、現在のオブジェクトに導入されるべきオブジェクトおよび関数内部のthisである.後ろのパラメータは現在のオブジェクトに渡すパラメータです.次のコードを実行します.
    
      var func=new function(){this.a="func"}
      var myfunc=function(x){    
          var a="myfunc";    
          alert(this.a);    
          alert(x);
      }
      myfunc.call(func,"var");
    
    
    それぞれfuncおよびvarがイジェクトされていることがわかる.ここでは、callの各パラメータの意味が分かります.applyおよびcallの両方については、機能的には同じであるが、両者はパラメータ的に異なる.第1のパラメータの意味は同じであるが、第2のパラメータ:applyから入ってきたのは1つのパラメータ配列であり、つまり複数のパラメータを1つの配列にして入ってきたが、callcallのパラメータとして入ってきた(第2のパラメータから開始した).如き
  • func.call(func1,var1,var2,var3)に対応するappyは、func.apply(func1,[var1,var2,var3])
  • と表記されています.
  • は、applyを使用する利点として、現在の関数のargumentsオブジェクトをapplyの第2のパラメータとして直接に
  • に入ることができる.
    よくある実例
    function add(a,b)  
    {  
        alert(a+b);  
    }  
    function sub(a,b)  
    {  
        alert(a-b);  
    }  
      
    add.call(sub,3,1);  
    
    この例ではsub、add.call(sub、3、1)=add(3、1)をaddで置換するという意味ですので、運転結果は:alert(4);/注意:jsの関数はオブジェクトであり、関数名はFunctionオブジェクトへの参照です.
    function Animal(){    
        this.name = "Animal";    
        this.showName = function(){    
            alert(this.name);    
        }    
    }    
      
    function Cat(){    
        this.name = "Cat";    
    }    
       
    var animal = new Animal();    
    var cat = new Cat();    
        
    //  call apply  ,     Animal   showName()      cat    。    
    //     "Cat"    
    animal.showName.call(cat,",");    
    //animal.showName.apply(cat,[]); 
    
    callとはanimalの方法をcatに置いて実行するという意味です.元々はcatはshowNameの方法がないので、今はanimalのshowNameの方法をcatに置いて実行します.だから、this.nameはCatであるべきです.
    継承を実現する用法
    function Animal(name){      
        this.name = name;      
        this.showName = function(){      
            alert(this.name);      
        }      
    }      
        
    function Cat(name){    
        Animal.call(this, name);    
    }      
        
    var cat = new Cat("Black Cat");     
    cat.showName();  
    
    アニマル.callとは、アニマルオブジェクトをthisオブジェクトの代わりに使用するという意味で、アニマルのすべての属性と方法がCatにあるのではないでしょうか?
    function Class10()  
    {  
        this.showSub = function(a,b)  
        {  
            alert(a-b);  
        }  
    }  
      
    function Class11()  
    {  
        this.showAdd = function(a,b)  
        {  
            alert(a+b);  
        }  
    }  
      
    function Class2()  
    {  
        Class10.call(this);  
        Class11.call(this);  
    }  
    
    二つのcallを使って多重継承を実現しました.
    参照