JavaScriptの4つの呼び出しモード

2358 ワード

ref:javascript言語の精髄
メソッドコールモード:
関数がオブジェクトの属性として保存されている場合、それを方法と呼びます.一つの方法が起動されると、thisはオブジェクトに結合されます.
一つの呼び出し式が属性アクセス式(「.」または「[]」)を含む場合、それは一つの方法として呼び出されます.

var myObject = {
	value: 0 ;
	increment: function(inc){
		this.value += typeof inc == 'number' ? inc : 1;
	}
};
myObject.increment();
document.writeln(myObject.value);  // 1

myObject.increment(2);
document.writeln(myObject.value);  // 3
方法は、オブジェクトにthisを使用してアクセスできますので、オブジェクトから値を取るか、または変更することができます.オブジェクトへのthisのバインディングは呼び出し時に発生します.
thisによって望ましい、それらが属するオブジェクトのコンテキストの方法を共通の方法と呼ぶ.
関数コールモード:

var sum = add(2,3) 
このモードで関数が呼び出されると、thisはグローバルオブジェクトに紐付けされます.これは言語設計上の誤りです.
内部関数が呼び出されると、thisは外部関数のthis変数にバインドされたままであるべきです.
この設計ミスの結果は方法が内部関数を利用して仕事を助けることができないことである.
内部関数のthisは誤った値にバインドされているので、この方法のオブジェクトへのアクセス権を共有することはできません.
ソリューション:
この方法が変数を定義して、彼にthisとして値を与えたら、内部関数はこの変数を通じてthisにアクセスできます.

myObject.double = function(){
	var that = this;
	
	var helper = function (){
		that.value = add(that.value,that.value);
	};
	helper(); //         helper
};
//         double
myObject.double();
document.writenln(myObject.getValue());
コンストラクタ呼び出しモード
JavaScriptは原型に基づいて継承された言語です.
関数の前にnewを持って呼び出したら、関数にリンクされたプロトタイプのメンバーを隠す新しいオブジェクトを作成します.
同時に、thisは新しいオブジェクトに結合されます.

//    :          
//    (    ), status  
var  Cons = function(status){
	this.status = status;
};

//  Cons  getStatus     
Cons.prototype.getStatus = function(){
	return this.status;
}

//   Cons  
var myObject = new Cons("normal");
myObject.getStatus();
アプリ/コールモード:

function print(a, b, c, d){
	alert(a + b + c + d);
}

function example(a, b , c , d){
// call    print,        
print.call(this, a, b, c, d);
// apply    print,           ,
//     JavaScript       arguments  
print.apply(this, arguments);
//       
print.apply(this, [a, b, c, d]);
}
apply/call方法紹介の参考
http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.