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

Согласно руководству по стилю Google 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 (всякий раз, когда он работает).

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

Другие вопросы по тегам