Объявления функций внутри блоков в соответствии с руководством по стилю 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
(всякий раз, когда он работает).
Таким образом, ваш первый пример отлично подходит.