apply...

この記事をなんとなく眺めていて「そういえばapply使えばレシーバ変えられるんだっけ…withいらなくね?」と思ってサンプルコードを書いてみるも、関数ではthisが必要なことに気づく…orz


とりあえず書いたコード。

<html>
  <head>
    <title>TEST</title>
    <script type="text/javascript" src="profiler.js"></script>
    <script>
      function sample_nothing() {
        var titles = new Array();
        for (var i = 0; i < 10000; i++) {
          titles.push(document.title);
        }
      };
      function sample_with() {
        var titles = new Array();
        for (var i = 0; i < 10000; i++) {
          with (document) {
            titles.push(title);
          }
        }
      }
      function sample_function() {
        var titles = new Array();
        (function() {
          for (var i = 0; i < 10000; i++) {
            titles.push(this.title);
          }
        }).apply(document);
      };
    </script>
  </head>
  <body>
    <input type="button" value="nothing" onclick="Profiler.profile('nothing', sample_nothing);">
    <input type="button" value="with" onclick="Profiler.profile('with', sample_with);">
    <input type="button" value="function" onclick="Profiler.profile('function', sample_function);">
    <input type="button" value="レポート" onclick="Profiler.report();">
  </body>
</html>

結果。