首先我运行它(在chrome中):
var start;
var end;
start = (new Date()).getTime();
for(var i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
输出: delay:2028
然后我运行这个:
function foo() {
var start;
var end;
start = (new Date()).getTime();
for(var i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
}
foo();
输出: delay:8
为什么在函数中使用相同的代码会缩短时间?
在节点中花了相同的时间(6和6),但是节点使用的是V8引擎,不是吗?
答案 0 :(得分:3)
因为在函数中所有变量都在闭包中。没有函数JavaScript解释器首先尝试在Global scope中查找变量。
答案 1 :(得分:2)
我认为这种行为只出现在控制台中的事实非常明显。我怀疑它与V8引擎如何将脚本缩减为本机代码有关。
第1点:我怀疑范围是不导致经济放缓的原因:
function foo() {
start = (new Date()).getTime();
for(i=0;i<10e5;i++);
end = (new Date()).getTime();
console.log('delay:' + (end-start));
}
此代码在全局范围内使用start
,end
和i
。如果搜索全局范围确实是瓶颈,那么此代码也应该运行缓慢,因为它在函数中没有局部变量。
第2点:如果您将代码放在实际的网页中,它会以任何一种方式快速运行。这告诉我,在控制台中运行代码是减速的来源。
通常,在网页上,V8引擎将JavaScript组装成本机二进制代码,因此运行速度非常快。但是,我怀疑从控制台运行的代码没有编译(或者可能是在运行时逐行编译,这本身会产生时间成本)。但是,当输入函数定义时,该函数将在第一次运行之前完整地编译。当程序流到达foo()
调用时,函数foo
已经编译成本机代码。因此,该函数运行速度很快,因为它已经过预编译,但控制台中的原始代码尚未预编译,因此运行缓慢。
这主要是猜测,但这个问题的答案也是如此。这是我可以设计的唯一解释,即上述#1和#2点。