Подтвердить что ты не робот

Объявления функций не должны размещаться в блоках. Используйте выражение функции или переместите оператор в начало внешней функции

У меня есть следующий код:

if (typeof console === "object" && typeof console.error === "function") {
    function e(msg) {"use strict"; console.info(msg);}
}

Для чего jsLint дает следующую ошибку:

Операторы функций не должны размещаться в блоках. Используйте выражение функции или переместите оператор в начало внешней функции.

Почему он дает эту ошибку и что это значит?

4b9b3361

Ответ 1

Вы не должны создавать функцию внутри if block. Вам гораздо лучше делать:

var e = function(){};

if(typeof console === "object" && typeof console.error === "function"){
    e = function (msg){ ... };
}

Ответ 2

Описание

На странице 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');
    }
}