f8g

クロージャ, call, apply

http://d.hatena.ne.jp/arikui/20090928/1254140257

var o = {r: 1};

1. クロージャ

o.f = function(){
	var self = this;
	(function(n){
		self.r += n;
	})(2);
};

2. call

o.f = function(){
	(function(n){
		this.r += n;
	}).call(this, 2);
};

3. apply (callのやつの単なる置き換え)

o.f = function(){
	(function(n){
		this.r += n;
	}).apply(this, [2]);
};

4. apply (argumentsを使う)

o.f = function(){
	(function(n){
		this.r += n;
	}).apply(this, arguments);
};

// o.f(2);

結果

firefox Chrome IE Opera
1 0.0002546 0.0006892 0.006588 0.002508
2 0.0002748 0.0004598 0.007134 0.00312
3 0.000806 0.000684 0.009875 0.004784
4 0.0056621 0.000458 0.012456 0.004944

Firefox の 4, 5 については結果が安定しなかったので, 〜10%減ぐらいに落ち着くかもしれない. それでも結構差は出るだろう.
全体的な傾向としてはスコープ辿るより call, apply で this を置き換えた方が遅いということになる. ただ, Google Chrome の結果はそれとは逆になっていて面白い.
次のような, 引数の配列を予め用意しておくコード.

o.a = [2];
o.f = function(){
	(function(n){
		this.r += n;
	}).apply(this, this.a);
};
Firefox Chrome
0.0003414 0.000592

あれ, Firefox も速くなってね?みたいなことになる. よく分からないので自分でご確認ください.

http://arikui.github.com/test/scope_call.html