JavaScriptにおけるApplyとCallの原理分析と使用


異なる定義
  • JavaScript関数またはオブジェクトで定義された関数は、関数f 2で定義されていない関数f 1のサブ関数ff 1であっても、f 2がff 1を呼び出すことができ、applyとcallがこの使用を実現することができる別の関数に動的にバインドすることができる.
  • JavaScriptによるapplyとcallの解釈は、指定されたオブジェクトを使用して現在のオブジェクトを置き換え、関数を呼び出すことです.
  • applyとcall:これらの役割は、定義パラメータのみで異なる関数を別のオブジェクトにバインドして実行することです.

  • 詳しく説明する
    JavaScriptの動的変換の実行時のコンテキスト特性、この特性は主にapply、callの2つの方法の運用に体現する.
     
    call、applyはFunctionに属します.Prototypeの1つの方法で、JavaScriptエンジン内で実現されています.Functionに属しているからです.prototypeは、各Functionオブジェクトのインスタンス、すなわち各メソッドにcall,apply属性がある.メソッドの属性である以上、それらの使用はもちろんメソッドに対するものである.この2つの方法は混同しやすい.それらの作用は同じで、使用方法が異なるだけだからだ.
     
    applyを区別してcallは一言で、
    foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments)==this.foo(arg1, arg2, arg3)

    同じ点:2つのメソッドが生み出す役割はまったく同じ異なる点です:メソッドが伝達するパラメータが異なります
     
    私たちは上のfooです.call(this,arg 1,arg 2,arg 3)は分析を展開した.fooはメソッドである、thisはメソッド実行時のコンテキスト関連オブジェクトであり、arg 1,arg 2,arg 3はfooメソッドに伝達するパラメータである.ここで、メソッド実行時のコンテキスト関連オブジェクトとは、オブジェクト向けのプログラミングの基礎がある場合、クラスインスタンス化後のオブジェクトにおけるthisであることが理解できる.
    JavaScriptでは、コードには常にコンテキストオブジェクトがあり、コードはそのオブジェクト内を処理する.コンテキストオブジェクトはthis変数によって体現され、このthis変数は常に現在のコードが置かれているオブジェクトを指す.
    ネット上のコードセグメントを参照すると、実行後に自然にその道理がわかります.
    <input type="text" id="myText"   value="input text">
    <script>
        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());   //  !
    </script>

    call関数とapplyメソッドの最初のパラメータは、現在のオブジェクトに入力するオブジェクトと、関数内部のthisです.後のパラメータは、現在のオブジェクトに渡されるパラメータです.次のコードを実行します.
    <script>
       var func=new function(){this.a="func"}
        var myfunc=function(x){
            var a="myfunc";
            alert(this.a);
            alert(x);
        }
        myfunc.call(func,"var");
    </script>

    funcとvarがそれぞれポップアップされていることがわかります.ここまでcallの各パラメータの意味について理解した.
     
    これが動的言語JavaScript callの威力です!
     
    参考資料
    http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html
    http://www.cnblogs.com/cc258/archive/2012/04/21/2462547.html
    http://www.spacespace.cn/read.php?153