Конкуренция с JS "используется до того как определено" и Titanium Developer - PullRequest
10 голосов
/ 05 марта 2010

У меня длинный JavaScript-файл, который передает JSLint, за исключением ошибок "использовался до того, как он был определен".

Я использовал обычные объявления функций, как в ...

function whatever() {do something;}

в отличие от ...

var whatever = function(){do something;};

и согласуется с Ответом Стива Харрисона на более раннее сообщение ...

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

... Мне нравится видеть функции в порядке, который имеет для меня смысл.

Сценарий отлично работает в нескольких протестированных браузерах (например, FireFox, Safari, Mobile Safari, Fennec, IE, Chrome, Midori и т. Д.).

Вот проблема: я хочу использовать скрипт внутри приложения для iPhone, созданного с помощью Titanium, но его компилятор останавливается с ошибками «использовались ранее определенные».

Как мне обойти это?

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

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

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

1 Ответ

10 голосов
/ 06 марта 2010

Нет, ответ EM - НЕ правильное решение. Попробуйте запустить этот JavaScript:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

Это потому, что интерпретатор сначала прочитает объявление функции, создаст имя foo как функцию, которая печатает "right", затем прочитает оператор var и обнаружит, что имя foo уже существует, поэтому как обычно, пропускается создание новой переменной со значением undefined. Затем он обрабатывает код построчно, который включает в себя присваивание foo. Объявление функции не обрабатывается повторно. Возможно, в Titanium все будет иначе, но попробуйте в Firebug, и вы получите то, что я получил.

Лучшее решение:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

Это также пройдет JSLint и даст правильное поведение.

...