全局变量javascript,更快“varname”或“window.varname”

时间:2012-07-01 15:56:16

标签: javascript performance scope global

var testvar = 'boat';

function testA() {

    console.log(testvar);

}

function testB() {

    console.log(window.testvar);

}

我知道如果我不放“窗口”。对于我的全局变量,然后javascript从方法testA开始搜索所有范围,直到它找到变量testvar,所以如果我做window.testvar而不是它使它更快,因为我直接告诉javascript查找变量的范围?或者更慢,因为我首先告诉javascript寻找窗口对象,然后是变量?

4 个答案:

答案 0 :(得分:2)

分别尝试以下两个代码并亲自查看结果。事实上,这可能不是最准确的测试用例,但是通过避免所有其他操作并在足够长的循环内进行简单的赋值,它应该足够准确。

我不得不说,我也很惊讶地看到,未指定window Chrome持续报告第二代码的执行速度提高了约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!');

<强>结果:

  • 1695ms
  • 1715ms
  • 1737ms
  • 1704ms
  • 1695ms

代码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!');

<强>结果:

  • 1415ms
  • 1450ms
  • 1422ms
  • 1428ms
  • 1450ms

在Chrome 20.0.1132.47中测试。

答案 1 :(得分:1)

Vedaant的jsperf没有帮助。它只是创建函数,而不是执行它们。试试这个:http://jsperf.com/epictest/9。它也表明不指定窗口更快。我还添加了一个测试,表明复制到局部变量的速度要快得多。改变循环计数器,看看你赢得的不仅仅是对全局的一次引用。

答案 2 :(得分:0)

Chrome有一个有用的javascript CPU分析器。只需创建一个循环来运行该函数数千次并启动分析器。我猜这个差别非常小,但这肯定是一个很好的方法。

答案 3 :(得分:0)

我刚刚为你做了一个jsPerf测试,请查看:http://jsperf.com/epictest。似乎

function testA() {

   console.log(testvar);

}

有点快。