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