1
var testvar = 'boat';

function testA() {

    console.log(testvar);

}

function testB() {

    console.log(window.testvar);

}

「窓」を入れないとわかりません。私のグローバル変数の場合、javascriptは変数testvarが見つかるまでメソッドtestA以降のすべてのスコープを検索します. ? または、最初にjavascriptにウィンドウオブジェクトを探してから変数を探すように指示しているため、遅くなりますか?

4

4 に答える 4

2

以下の両方のコードを別々に試して、結果を自分で確認してください。実際、これは最も正確なテストケースではないかもしれませんが、他のすべての操作を回避し、十分な長さの for ループ内で単純な割り当てを行うことで、十分に正確になるはずです。

windowまた、 Chrome を指定しないことで、2 番目のコードの実行が約 20% 高速になることが永続的に報告されたことにも驚いたと言わざるを得ません。

コード 1

// window.testvar testcase.
window.testvar = 'Hi there! I am a testvar!';
var tmp;
var start = new Date();
for(var i = 0; i < 1000000; i++){
    tmp = window.testvar;
}
var stop = new Date();
console.log('This took exactlly ' + (stop.getTime() - start.getTime()) + ' milliseconds!');

結果:

  • 1695ミリ秒
  • 1715ミリ秒
  • 1737ミリ秒
  • 1704ミリ秒
  • 1695ミリ秒

コード 2

// direct testvar testcase
testvar = 'Hi there! I am a testvar!';
var tmp;
var start = new Date();
for(var i = 0; i < 1000000; i++){
    tmp = testvar;
}
var stop = new Date();
console.log('This took exactlly ' + (stop.getTime() - start.getTime()) + ' milliseconds!');

結果:

  • 1415ミリ秒
  • 1450ミリ秒
  • 1422ミリ秒
  • 1428ミリ秒
  • 1450ミリ秒

Chrome 20.0.1132.47 でテスト済み。

于 2012-07-01T16:21:51.600 に答える
1

Vedaant の jsperf は役に立ちませんでした。関数を作成するだけで、実行することはありませんでした。これを試してみてください: http://jsperf.com/epictest/9。これも、window を指定しない方が速いことを示しています。また、ローカル変数へのコピーが劇的に高速であることを示すテストも追加しました。ループ カウンターを変化させて、グローバルへの参照が 1 つ以上ある場合に勝つことを確認します。

于 2012-08-22T19:28:58.137 に答える
0

jsPerfテストを作成しました。http://jsperf.com/epictestで確認してください。のようだ

function testA() {

   console.log(testvar);

}

少し速いです。

于 2012-07-01T16:16:36.443 に答える
0

Chrome には便利な JavaScript CPU プロファイラーがあります。関数を数千回実行するループを作成し、プロファイラーを開始するだけです。違いは非常に小さいと思いますが、これは確実に知る良い方法です。

于 2012-07-01T16:08:05.673 に答える