Я думаю, что тот факт, что это поведение проявляется только в консоли, очень показателен. Я подозреваю, что это связано с тем, как движок 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 выше.
person
apsillers
schedule
22.06.2012