Перед компилированием кода любой нормальный интерпретатор прогоняет его через оптимизатор. Грубя говоря, вот так:
//до оптимизации
function testForPositiveness(numbers) {
let isPositive = (number) => number > 0;
let results = [];
for (let number of numbers) {
results.push(isPositive(number));
}
return results;
}
//после оптимизации
function testForPositiveness(numbers) {
let results = [];
for (let number of numbers) {
results.push(number > 0);
}
return results;
}
Здесь оптимизатор видит, что функция isPositive может быть использована только в testForPositiveness и что можно с чистой совестью заинлайнить её. Если бы isPositive была где-нибудь в глобальном скопе, ничего не вышло бы (неизвестно, кто еще может её вызывать). Если бы где-то внутри testForPositiveness стоял эвал, ничего не вышло бы (по той же причине; заодно похерилась бы куча остальных возможных оптимизаций).