У меня есть длинный файл JavaScript, который передает JSLint за исключением "используемого, прежде чем он был определен" ошибки.
Я использовал нормальные объявления функции, как в...
function whatever() {do something;}
в противоположность...
var whatever = function(){do something;};
и согласовывающийся с ответом Steve Harrison на более раннее сообщение...
Принятие Вас объявляет все Ваши функции с функциональным ключевым словом, я думаю, что это становится вопросом о стиле программирования. Лично, я предпочитаю структурировать свои функции способом, который кажется логичным и делает код максимально читаемым. Например, как Вы, я поместил функцию init наверху, потому что это - где все начинает с.
... Мне нравится видеть функции в порядке, который имеет смысл мне.
Сценарий функционирует отлично в этих нескольких протестированных браузерах (например, FireFox, Safari, Мобильный Safari, Фенек, IE, Chrome, Midori, и т.д.).
Вот проблема: Я хочу использовать сценарий в приложении для iPhone, создаваемом с Титаном, но его остановки компилятора с "используемым, прежде чем определено" ошибки.
Как я могу обойти это?
Это могло бы быть глупым вопросом, но также и... Если функции должны быть вызваны в особом порядке, как каждый разрешает вопрос вызванной функции, бывшей должной перезвонить к функции, которая первоначально назвала его? Например...
function buildMenu(){
Display a list of five menu items, each of which calls a function to build the associated screen.
}
function screen1() {
Display the screen associated with menu item #1.
}
Если функции должны быть объявлены в порядке, function screen1
должен был бы предшествовать function buildMenu
. Но что, если при определенных условиях screen1 не может быть создан и следовательно хочет вновь отобразить меню (т.е. вызывание функции, которая технически еще не объявляется)?
О, да... еще один вопрос: Есть ли веб-сайты или программы, которые автоматически повторно упорядочивают функции вместо того, чтобы требовать, чтобы программист сделал это вручную?
Нет, ответ EM - НЕ правильное решение. Попробуйте запустить этот JavaScript:
(function () {
foo(); // right
var foo = function () {
console.log("wrong");
};
foo(); // wrong
function foo() {
console.log("right");
}
foo(); // wrong
}());
Это потому, что интерпретатор сначала прочитает объявление функции, создаст имя foo
как функцию, которая печатает «правильно», а затем прочитает инструкцию var
, и обнаружит, что уже существует имя foo
, поэтому он пропустит создание новой переменной со значением undefined
, как обычно. Затем он обрабатывает код построчно, что включает присвоение foo
. Объявление функции не обрабатывается повторно. Возможно, это будет вести себя по-другому в Titanium, но попробуйте это в Firebug, и вы получите то, что получил я.
Лучшее решение:
var screen1, buildMenu;
screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };
Это также передаст JSLint и приведет к правильному поведению.