Функция была использована до ее определения - 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, но в реальном проекте мои функции - обработчики событий, а иногда они называют друг друга, поэтому, вероятно, это невозможно.
Ответы
Ответ 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 может быть функцией для всего, что он заботится (но если он не является функцией, он, конечно, бросает ошибку)