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

Функция была использована до ее определения - 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();   

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Так почему же 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)

Ответ 3

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