Содерживая JS «Используется до определенного» и разработчика Titanium
-
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 и производит правильное поведение.