2010-03-05 8 views
10

Mam długiego pliku JavaScript, który przekazuje JSLint z wyjątkiem błędów "used before it defined".Rywalizacja z JS "używane przed zdefiniowaniem" i programistą Titanium

Kiedyś normalne deklaracje funkcji, jak w ...

function whatever() {do something;} 

w przeciwieństwie do ...

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

i zgodne z Steve Harrison's reply do wcześniejszego postu ...

Zakładając, że zadeklarujesz wszystkie swoje funkcje za pomocą słowa kluczowego funkcji, I pomyśl, że staje się pytaniem o styl programowania w stylu . Osobiście preferuję strukturę moich funkcji w sposób, który wydaje się logiczny i sprawia, że ​​kod jest czytelny, jak to tylko możliwe. Na przykład, , tak jak ty, wstawiłbym funkcję init na u góry, ponieważ od tego wszystko zaczyna się od .

... Lubię widzieć funkcje w kolejności, która ma dla mnie sens.

Skrypt działa doskonale w kilku testowanych przeglądarkach (np. FireFox, Safari, Mobile Safari, Fennec, IE, Chrome, Midori itp.).

Oto problem: chcę użyć skryptu wewnątrz aplikacji na iPhone'a zbudowanej z Titanium, ale jej kompilator zatrzymuje się na błędach "używane przed zdefiniowaniem".

Jak mogę to obejść?

To może być głupie pytanie, ale także ... Jeśli funkcje muszą być wywoływane w określonej kolejności, w jaki sposób rozwiązuje się kwestię wywoływanej funkcji, która musi oddzwonić do funkcji, która pierwotnie ją nazwała? Na przykład ...

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. 
} 

Jeśli funkcje muszą być zadeklarowane w porządku, function screen1 musiałaby poprzedzać function buildMenu. Ale co jeśli w pewnych warunkach nie można zbudować screen1, a zatem chce on ponownie wyświetlić menu (tj. Wywołanie funkcji, która technicznie jeszcze nie została zadeklarowana)?

O tak ... jeszcze jedno pytanie: czy istnieją strony internetowe lub programy, które automatycznie zmieniają kolejność funkcji, zamiast wymagać od programisty, aby zrobił to ręcznie?

Odpowiedz

8

Nie, odpowiedź EM nie jest właściwym rozwiązaniem. Spróbuj uruchomić tę JavaScript:

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

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

    foo(); // wrong 

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

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

To dlatego, że interpreter najpierw przeczytać deklarację funkcji, utworzyć nazwę foo jako funkcja, która drukuje „prawo”, a następnie odczytuje oświadczenie var, a okaże się, że nie ma już nazwa foo, więc pominie tworzenie nowej zmiennej o wartości undefined, jak zwykle się dzieje. Następnie przetwarza kod, line-by-line, który obejmuje przypisanie do foo. Deklaracja funkcji nie jest przetwarzana ponownie. Może to będzie inaczej w Titanium, ale spróbuj tego w Firebug, a dostaniesz to, co otrzymałem.

Lepszym rozwiązaniem jest:

var screen1, buildMenu; 

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

to również przechodzić JSLint i dają prawidłowe działanie.

+0

Dziękuję. Nie miałem czasu sprawdzić poprzedniego rozwiązania, więc zrobię to. Dzięki jeszcze raz. –

+0

Dobra uwaga. Właściwie to nie przetestowałem swojego rozwiązania. Właśnie przeprowadziłem to przez jslint. – EndangeredMassa

+0

Działa doskonale zarówno w JSLint i Titanium. Dzięki jeszcze raz. B. BTW: Dla każdego, kto chce wprowadzić tę zmianę do istniejącego skryptu, tak jak ja, prostym skrótem do tworzenia listy zmiennych globalnych funkcji jest uruchomienie skryptu przez JSLint i skopiowanie listy Global z dołu wyniki. To nie jest w 100% dokładne, ale w mojej sytuacji, mając około 100 funkcji, musiałem tylko dokonać pół tuzina poprawek. –

Powiązane problemy