javascript関数の4つの呼び出し方法

1823 ワード

javascriptには全部で4つの関数コールモードがあります.それぞれは、方法呼び出しモード、関数呼び出しモード、構造関数呼び出しモード、およびapplyコールモードです.この4つのモードの主な違いは、キーパラメータthisをどのように初期化するかにあります.
メソッドコールモード
 関数をオブジェクトとして保存する方法を一つの方法と呼びます.一つの方法が起動されると、thisはオブジェクトに結合されます.方法はthisを使って自分の所属するオブジェクトにアクセスできます.
var testObj = {

  value: 0,

  a: 10,

  b: 20,

  sum: function(){

    this.value = this.a + this.b; 

  }

};



testObj.sum();

testObj.value;  // 30
 
関数コールモード
関数がオブジェクトの属性ではない場合、関数として呼び出されます.このモードで関数を呼び出すと、thisはグローバルオブジェクトに結合されます.
value = 100;

var testObj = {

  value: 10,

  getValue: function(){

    var tempFun = function(){

      console.log(this.value);

    };

    tempFun();

  }

};



testObj.getValue();	// 100
上記の例から、私達はthisが全体のオブジェクトに結び付けられていることが見えます.これはjavascript言語の設計上の誤りです.もし言語の設計が正しいなら、内部関数が呼び出された時に、thisは依然として外部関数のthis変数に結び付けられているはずです.しかし、簡単な解決策があります.この方法で変数を定義して、その値をthisとして付与すれば、内部関数はその変数を通じてthisにアクセスできます.普通は約束通りにその変数をthatと名づけます.
value = 100;

var testObj = {

  value: 10,

  getValue: function(){

    var that = this;

    var tempFun = function(){

      console.log(that.value);

    };

    tempFun();

  }

};



testObj.getValue();  // 10

  
コンストラクタ呼び出しモード
 javascriptはプロトタイプに基づいて継承される言語であり、これはオブジェクトが直接に他のオブジェクトから属性を継承できることを意味する.関数の前にnewを持って呼び出したら、その関数に接続されたプロトタイプのメンバーの新しいオブジェクトを作成します.
var Info = function(name){

  this.name = name;

};



Info.prototype.getName = function(){

  return this.name;

};



var people = new Info("patten");

people.getName();  // "patten"

  
アプリコールモード
javascriptは関数式のオブジェクト指向プログラミング言語であるため、関数は方法を持つことができる.
具体的な詳細は私のもう一つの文章を参照してください.  javascript中callとappy方法