下の二つはブラウザによって動作が違うみたいというお話でした。
button.onclick = function(){ window.open(url); };
button.onclick = function(){ setTimeout(function(){ window.open(url); }, 1); };
http://arikui.github.com/js/popupblock.html
<html> <head> <title>test</title> <script type="text/javascript"> function execute(){ window.open("popupblock.html"); } function click1(){ execute(); } function click2(){ setTimeout(function(){ execute(); }, 1); } function click3(){ var req = new XMLHttpRequest; req.onreadystatechange = function(){ if(this.readyState == 4){ execute(); } }; req.open("GET", "popupblock.html"); req.send(); } </script> <body> <button onclick="click1();">click</button> <button onclick="click2();">setTimeout</button> <button onclick="click3();">XMLHttpRequest</button> <button onclick="document.getElementsByTagName('button')[0].click();">call first button's event</button> </body> </html>
もう1年も経っていた。
http://d.hatena.ne.jp/arikui/20091021
久々に気になったのでちょっと直して測りなおしました。計測PCも違ってたりしますが、多分傾向は同じ。
単位はナノ秒。
plain 57 closure 218 call 230 apply 520 apply arguments 1700 apply this value 262 closure 3 nest 516 call 3 nest 518
クロージャもcallも大して差がなくなった。argumentsをapplyすると一気に遅い。
plain 13 closure 114 call 137 apply 211 apply arguments 322 apply this value 107 closure 3 nest 395 call 3 nest 360
argumentsのapplyが速くなった。コンテキスト辿るのも速くなった感じがする。
plain 410 closure 2443 call 1733 apply 2043 apply arguments 4427 apply this value 1867 closure 3 nest 3886 call 3 nest 4143
クロージャが遅いみたいだけど、callを重ねると大差なくなる。
plain 35 closure 523 call 558 apply 195 apply arguments 1135 apply this value 672 closure 3 nest 1583 call 3 nest 1835
配列のapplyが何故か速い。
plain 44 closure 960 call 993 apply 962 apply arguments 1131 apply this value 1060 closure 3 nest 2829 call 3 nest 2881
平均的。
plain 24 closure 79 call 266 apply 120 apply arguments 285 apply this value 286 closure 3 nest 131 call 3 nest 713
callがやけに遅い。