Объявление функций в условных операторах нестандартно, столь не делают что . Это - известная проблема. Можно использовать выражения function вместо деклараций:
var f;
if(true) {
f = function() { alert("yes"); };
} else {
f = function() { alert("no"); };
}
f();
известная статья Kangax о выражениях function предоставляет некоторую дополнительную подробную информацию:
FunctionDeclarations только разрешают появиться в Программа или FunctionBody . Синтаксически, они не могут появиться в Блок ({...})
— такой как код , если
, , в то время как
или для
заявления. Это вызвано тем, что Блокируют , может только содержать Заявления , не SourceElements , который FunctionDeclaration .
В той же самой статье также говорится:
Стоит упомянуть, что согласно спецификации, внедрениям позволяют ввести расширения синтаксиса (см. раздел 16), и все же полностью соответствовать. Это точно, что происходит в таком количестве клиентов в эти дни. Некоторые из них интерпретируют объявления функции в блоках как любые другие объявления функции — просто подъем их к вершине объема приложения; Другие — вводят различную семантику и следуют немного более сложным правилам.