Для разбора и запуска второй функции требуется меньше времени, чем для первой, как при загрузке страницы, так и при ее выполнении.
При загрузке страницы интерпретатор должен просмотреть весь текст, проверитьчто его синтаксис действителен, создайте абстрактное синтаксическое дерево из результата и (на более новых движках) скомпилируйте результат в машинный код.Даже если большая часть тела функции a
никогда не выполняется , она все равно должна быть проанализирована .Разбор 1 миллиона строк Javascript - нетривиальная задача.
Когда каждая функция выполняется , a
может занять больше времени, чем b
, даже если толькобит - например, если a
определяет много переменных внутри этих строк, переменные имеют область действия a
:
function a() {
var a = false;
if(a) {
var b = 'b';
var c = 'c';
// more lines
}
}
Когда функция запущена, интерпретатор должен просмотреть все переменные, определенные вif
блок, который никогда не запускается, так что эти имена переменных могут быть правильно инициализированы.Когда функция запущена, var b;
и 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;
}
}
будет проанализирована, скомпилирована и выполнена быстрее.