Содерживая JS «Используется до определенного» и разработчика Titanium

StackOverflow https://stackoverflow.com/questions/2389551

  •  24-09-2019
  •  | 
  •  

Вопрос

У меня длительный файл JavaScript, который проходит Jslint, за исключением «использованных, прежде чем было определено» ошибки.

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

function whatever() {do something;}

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

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

и соответствует Ответ Стива Харрисона до предыдущего поста ...

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

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

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

Вот проблема.

Как я могу обойти это?

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

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. Отказ Но что если при определенных условиях экран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. Отказ Декларация функции не получает переработки. Может быть, это будет вести себя по-разному в титане, но попробуйте это в Firebug, и вы получите то, что я получил.

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

var screen1, buildMenu;

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top