Утверждение с JS, “используемым, прежде чем определено” и Разработчик Титана

У меня есть длинный файл 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 не может быть создан и следовательно хочет вновь отобразить меню (т.е. вызывание функции, которая технически еще не объявляется)?

О, да... еще один вопрос: Есть ли веб-сайты или программы, которые автоматически повторно упорядочивают функции вместо того, чтобы требовать, чтобы программист сделал это вручную?

10
задан Community 23 May 2017 в 11:52
поделиться

1 ответ

Нет, ответ 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 и приведет к правильному поведению.

10
ответ дан 4 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: