クロージャ, 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 も速くなってね?みたいなことになる. よく分からないので自分でご確認ください.