第二个函数的解析和运行时间应该比第一个函数少,无论是在页面加载时还是在函数执行时。
在页面加载时,解释器必须遍历所有文本,检查其语法是否有效,从结果构造一个抽象语法树,然后(在较新的引擎上)将结果编译为机器代码。即使大部分a
函数体从未被执行,它仍然需要被解析。解析 100 万行 Javascript 是一项艰巨的任务。
执行每个函数时,a
运行时间可能比 运行时间长b
,即使只是一点点 - 例如,如果a
在这些行中定义了许多变量,则变量范围为a
:
function a() {
var a = false;
if(a) {
var b = 'b';
var c = 'c';
// more lines
}
}
当函数运行时,解释器必须查看if
块中定义的所有从未运行的变量,以便可以正确初始化这些变量名称。当函数运行时,var b;
and var c
; 并且任何其他var
s 将被提升到顶部:
function a() {
var a;
var b;
var c;
// initialize any other variables local to this function
a = false;
if(a) {
b = 'b';
c = 'c';
// more lines
}
}
如果有许多变量要初始化,这可能会导致函数花费的时间比没有变量要初始化的情况要长一些。
相反,一个没有多余变量要初始化,也没有很多行要解析的函数:
function b() {
var a = false;
if (a != true) {
return;
}
}
将被更快地解析、编译和运行。