Объявление функций внутри блоков в соответствии с руководством по стилю JavaScript JavaScript

В соответствии с руководством по стилю JavaScript JavaScript объявления функций не должны быть объявлены в блоках, поскольку это не является частью ECMAScript. Тем не менее, я не совсем понимаю, что считается блоком.

В частности, у меня есть функция-конструктор, и я хочу определить функцию в рамках этого конструктора. Будет ли это считаться функцией внутри блока, так как оно находится в наборе {}? Если это так, означает ли это, что каждое объявление функции должно быть глобальным?

Некоторый код для хорошей оценки:

НЕПРАВИЛЬНО (?)

function Constructor() {
    function Shout () { alert('THE BEST UX IS IN ALL CAPS.'); }
}

ПРАВИЛЬНО (?)

function Constructor() {
    var Shout = function () { alert('THE BEST UX IS IN ALL CAPS.'); };
}

Ответ 1

Функция не является блоком. Блок (например), который следует за while, for или if.

Во-первых, поймите, что объявления функций (function foo() {}) подняты в верхней части области их содержащей функции (т.е. вы можете получить доступ к объявленным функциям по имени в любом месте той же области, что и декларация).:

foo();
function foo() { }

Этот код вне порядка 100% закончен, потому что объявление foo поднимается выше вызова foo(). Однако теперь представьте, что у вас есть условное объявление:

if(false) {
    function foo() { }
}

С точки зрения языка, следует ли поднимать foo? Поток программы никогда не войдет в блок, но мы обычно поднимаем все объявления. Из-за этой путаницы декларации внутри блоков не являются частью грамматики, определенной спецификацией ECMAScript (хотя каждая реализация поддерживает эту грамматику, но вызывает в каждом из них другой, нестандартный эффект).

Наличие функции внутри другой функции не несет этой путаницы:

function bar() {
    function foo() { }
}

Очевидно, что foo будет поднято до вершины bar (всякий раз, когда он выполняется).

Таким образом, ваш первый пример отлично подходит.