Ответ 1
Вы не должны создавать функцию внутри if block. Вам гораздо лучше делать:
var e = function(){};
if(typeof console === "object" && typeof console.error === "function"){
e = function (msg){ ... };
}
У меня есть следующий код:
if (typeof console === "object" && typeof console.error === "function") {
function e(msg) {"use strict"; console.info(msg);}
}
Для чего jsLint дает следующую ошибку:
Операторы функций не должны размещаться в блоках. Используйте выражение функции или переместите оператор в начало внешней функции.
Почему он дает эту ошибку и что это значит?
Вы не должны создавать функцию внутри if block. Вам гораздо лучше делать:
var e = function(){};
if(typeof console === "object" && typeof console.error === "function"){
e = function (msg){ ... };
}
На странице jsLintErrors о предупреждении Операторы функций не должны размещаться в блоках:
Эта ошибка возникает, чтобы выделить код, который может работать не так, как вы ожидаете.. В большинстве сред ваш код будет работать без ошибок, но, возможно, не так, как вы ожидаете. В некоторых средах это может привести к сильной синтаксической ошибке .
Это потому, что объявления
Function
отображаются вверху области, в которой они отображаются.Следовательно, невозможно условно объявить функцию с помощью блока.
Давайте рассмотрим проблемы, поднятые этой проблемой, на простом примере:
if (true) {
function example() {
console.log('hello');
}
}
Лучший сценарий заключается в том, что ваш код запутан. В приведенном выше примере похоже, что вы хотите только объявить доступ к функции, если условие истинно. Однако, когда функция поднимается до вершины области видимости, она будет фактически интерпретироваться так:
function example() {
console.log('hello');
}
if (true) {}
Это опасно, потому что это не похоже на то, что вы ожидаете от исходного кода. Условный блок фактически пуст (и не нужен), и каждый имеет доступ к функции, независимо от того, имеет ли условие значение true или false.
Наихудший сценарий заключается в том, что браузер не понимает, что делать с вложенной функцией, и генерирует синтаксическую ошибку при попытке ее использования. Это зависит от движка JavaScript. Похоже, что Firefox - один из таких движков. Если вы запустите следующий код в Firefox, он выкинет ошибку при выполнении следующего кода:
if (true) {
example();
function example() {
console.log('hello');
}
}