javascript関数が呼び出す様々な方法

2673 ワード

JavaScriptでは、次の4つの呼び出し方法があります.(1)基本関数呼び出し(2)メソッド呼び出し(3)コンストラクタコール(4)はコール()とappy()で呼び出します.
  • 基本関数呼び出し
  • 一般関数呼び出しモード、例えば:
    function fn(o){
         …… 
      }
      fn({x:1});
    
    基本関数呼び出しでは、(1)各パラメータが、宣言関数に実際に渡すときに定義されるイメージとして定義されます.(2)thisはグローバル変数に結合されています.
    JavaScript code[?]
    var object = {value:1};
      var value = 2;
     object.printProps = function(){
        var printValue = function(){
          console.log(this.value);
        };
       printValue();
       console.log(this.value);
     }
     object.printProps();
    
    この時の運転結果は、2 1
    print Value()関数が実行されるとき、this.value値は2であり、つまり、thisは対象のobjectではなくグローバルオブジェクトを指す.
    (3)戻り値:関数の戻り値が呼び出された式の値となります.I.関数の戻りがインタプリタで終端に到達した場合、つまりreturn XXXに実行されていない文です.戻り値はundefinedです.II.関数がリターンした場合、レセプタがreturn xxx文に実行したため、return以降の値を返します.III.return文の後に値がない場合、すなわちreturnはundefinedに戻ります.
  • メソッド呼び出し
  • 関数がオブジェクトの属性として保存されている場合、方法と呼びます.(1)パラメータと戻り値の処理は、関数呼び出しと一致します.(2)コンテキストthisを呼び出します.
    function print(){
        console.log(this.value); 
      }
      var value=1;
      var object = {value:2};
      object.m = print;
      //      
      print();
      //      
      object.m();
    
    運転結果は:1 2
    printを呼び出すと、thisはグローバルオブジェクトにバインドされ、グローバル変数value値1を印刷します.しかし、Object.m()を呼び出した場合、thisはメソッドmが属するオブジェクトObjectをバインドしているため、印刷の値はObject.valueであり、すなわち2である.
  • コンストラクタ呼び出し
  • 関数または方法が呼び出される前にキーワードnewが付いています.構造関数呼び出しを構成します.例えば:
    function fn(){……}
     var obj = new fn();
    
    (1)パラメータ処理:一般的な場合のコンストラクタパラメータ処理と関数コールモードは一致しています.しかし、コンストラクタが使用されていない場合、JavaScript構文は、参加リストと括弧を省略することができます.
    下の二行のコードは等価です.
     var obj = new Object();
     var obj = new Object;
    
    (2)関数の呼び出しコンテキストは、新規作成されたオブジェクトです.
    function fn(value){
       this.value =value;
     }
     var value =1;
     var obj = new fn(2);
     console.log(value);
     console.log(obj.value);
     fn(3);
     console.log(value);
     console.log(obj.value);
    
    運転結果:1 2 3 2
    I.初めてfn()関数を呼び出したのはコンストラクターとして呼び出されたので、コンテキストthisを呼び出して新しく作成されたオブジェクトobjにバインドされます.したがって、グローバル変数value値は変わりません.Objに属性valueが追加され、値は2です.II.2回目の呼出fn()関数は、通常の関数として呼び出されたもので、上下はthisでグローバルオブジェクトに紐付けされ、ブラウザではwindowとなります.したがって、グローバルオブジェクトのvalue値は3に変更され、Objの属性値は変わらない.
    (3)コンストラクタは、通常、returnキーを使用せずに、新しいオブジェクトに戻ります.また、アーキテクチャー関数が表示されたままにreturn文を使ってオブジェクトを返すと、表式の値を呼び出すのはこのオブジェクトです.コンストラクタがreturn文を使用しているが、戻り値が指定されていない場合や元の値に戻る場合は、戻り値を無視して、新しいオブジェクトを呼び出しの結果として使用します.
    4.コール()とアプリ()で呼び出します.
    独立した関数の呼び出しでは、strictモードかどうかによって、thisはundefinedまたはwindowを指しますが、thisの指向をコントロールできます.関数のthisがどのオブジェクトを指すかを指定するには、関数自体のapply()またはcall()の方法で2つのパラメータを受信します.
    call()メソッドは、独自のパラメータリストを関数として使用しています.
    applyメソッドの最初のパラメータは変更されたコールオブジェクトで、2番目のパラメータは関数パラメータを配列形式で[]に入力しますが、call()の最初のパラメータはcall()の方法と同じです.2番目のパラメータは元のパラメータシーケンスです.