スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

JavaScriptでブロックスコープを実現する最速の方法

GreaseMonkeyのスクリプトを書いていたら、入れ子にしたfor文の内側と外側で同じ変数名を使ってしまい、無限ループになってFirefoxが固まった。JavaScriptにブロックスコープがあればこんなことは起こらなかったので、この仕様を決めた奴は氏ぬ全世界に謝罪するべきだと思う。

JavaScriptにはブロックスコープが無いのはよく知られた話だ。 以下のコードはコンソールに「0」を書き出す。

var x = 123;
{
  var x = 0;
}
console.log(x); // 0を出力

この問題に対する対処法もよく知られている。

var x = 123;
(function(){
  var x = 0;
})();
console.log(x); // 123を出力

さて、今日何となく「JavaScript ブロックスコープ」でググると、別の対処法を知った。

いくつかの対処法があるのは分かったが、実際、この中のどれが一番速いのだろうか。 new function(){}function(){}.call(new Object)とほぼ同じこと(返すものが違う)なのでnew Objectの分遅そうだ。

コードを書いて検証してみた。 まとめ:

  • Safariすげー
  • letがあればそれが一番速い
  • letがなければ (function(){})() が一番速い
  • new function(){} はやっぱり遅い
  • with(){} はその中間
  • みんな (function(){})() を使おう←もう使ってるよね
  • だれかletを(function(){})()に直すトランスレータを書いてくれ

以下、検証に使ったコードとその実行結果。

function time(name,f) {
  var t1 = new Date();
  f();
  var t2 = new Date();
  console.log(name+":"+(t2.getTime()-t1.getTime())+"ms");
}
var N = 1e6;
time("no block scope",function() {
  for (var i = 0; i < N; ++i) {
    var someVariable = 123;
    var _i = 0;
  }
});
time("(function(){})()",function() {
  for (var i = 0; i < N; ++i) {
    (function(){
      var someVariable = 123;
      var i = 0;
    })();
  }
});
time("new function(){}",function() {
  for (var i = 0; i < N; ++i) {
    new function(){
      var someVariable = 123;
      var i = 0;
    };
  }
});
time("with",function() {
  for (var i = 0; i < N; ++i) {
    with({i:i}) {
      var someVariable = 123;
      var i = 0;
    }
  }
});
/* FirefoxでJavaScript 1.7として実行してね
time("let",function() {
  for (var i = 0; i < N; ++i) {
    let someVariable = 123;
    let i = 0;
  }
});
*/

Safari:

no block scope:5ms
(function(){})():175ms
new function(){}:599ms
with:256ms

Chrome:

no block scope:3ms
(function(){})():220ms
new function(){}:1197ms
with:559ms

Firefox:

no block scope:95ms
(function(){})():1518ms
new function(){}:8219ms
with:7224ms
let:109ms
スポンサーサイト

テーマ : プログラミング | ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

minoki

Author:minoki
好きなプログラミング言語:
Haskell,Lua
GitHubアカウント
Twitter

最新記事
月別アーカイブ
カテゴリ
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。