var testvar = 'boat';
function testA() {
console.log(testvar);
}
function testB() {
console.log(window.testvar);
}
我知道如果我不放“窗口”。对于我的全局变量,然后javascript从方法testA开始搜索所有范围,直到它找到变量testvar,所以如果我做window.testvar而不是它使它更快,因为我直接告诉javascript查找变量的范围?或者更慢,因为我首先告诉javascript寻找窗口对象,然后是变量?
答案 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!');
<强>结果:强>
代码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!');
<强>结果:强>
在Chrome 20.0.1132.47中测试。
答案 1 :(得分:1)
Vedaant的jsperf没有帮助。它只是创建函数,而不是执行它们。试试这个:http://jsperf.com/epictest/9。它也表明不指定窗口更快。我还添加了一个测试,表明复制到局部变量的速度要快得多。改变循环计数器,看看你赢得的不仅仅是对全局的一次引用。
答案 2 :(得分:0)
Chrome有一个有用的javascript CPU分析器。只需创建一个循环来运行该函数数千次并启动分析器。我猜这个差别非常小,但这肯定是一个很好的方法。
答案 3 :(得分:0)