Функция использовалась до того, как была определена - JSLint

JSLint не нравится этот код, говорящий "b" использовался до того, как он был определен "

var a = function () {
        b();
    },

    b = function () {
        alert("Hello, world!");
    };

a();   

но вполне доволен этим

var a, b;

a = function () {
    b();
};

b = function () {
    alert("Hello, world!");
};

a();   

Но я ничего не определяю в своем втором фрагменте кода. Я просто объявляю переменную б.

Так почему же JSLint делает это? Есть ли причина, по которой я должен сначала объявить все свои функции?

PS Я понимаю, что мог бы просто изменить порядок a и b, но в реальном проекте мои функции - это обработчики событий, а иногда они вызывают друг друга, поэтому это, вероятно, невозможно.

3 ответа

Решение

Если ваш код хорошо написан и объектно-ориентирован, вы можете объявить ваши функции перед их использованием. Но JSLint устанавливает множество стандартов, которые на самом деле имеют мало отношения к функциональности вашего приложения, и я действительно сомневаюсь, что существуют какие-либо последствия для производительности, объявляющие функции так или иначе.

Так почему же JSLint делает это? Есть ли причина, по которой я должен сначала объявить все свои функции?

Да, в противном случае могут возникнуть непредвиденные ошибки. Ваш код работает из-за "Подъема" JavaScript. Этот механизм извлекает все объявления, неявные или явные, и может привести к неожиданным результатам.

Рассмотрим этот код:

var s = "hello";    // global variable
function foo() {
    document.write(s);   // writes "undefined" - not "hello"
    var s = "test";      // initialize 's'
    document.write(s);   // writes "test"
};
foo();

Это интерпретируется следующим образом:

var s = "hello";    // global variable
function foo() {
    var s;               // Hoisting of s, the globally defined s gets hidden
    document.write(s);   // writes "undefined" - now you see why
    s = "test";          // assignment
    document.write(s);   // writes "test"
}
foo();

(пример взят со страницы немецкой Википедии: http://de.wikipedia.org/wiki/Hoisting)

В C это то, что мы называем предварительным объявлением, похоже, что оно может быть таким же в JSLint. JSLint знает о b, и в этот момент b может быть функцией для всех, кого это заботит (но если это не функция, она, конечно, выдаст ошибку)

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