Pergunta

Eu tenho um arquivo JavaScript longo que passa JSLint, exceto para erros "usado antes de ser definido".

Usei declarações de funções normais, como em...

function whatever() {do something;}

ao contrário de...

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

e consistente com Resposta de Steve Harrison para uma postagem anterior...

Supondo que você declare todas as suas funções com a palavra-chave da função, acho que se torna uma pergunta de estilo de programação.Pessoalmente, prefiro estruturar minhas funções de uma maneira que pareça lógica e torne o código o mais legível possível.Por exemplo, como você, eu colocaria uma função init no topo, porque é de onde tudo começa.

...Gosto de ver as funções em uma ordem que faça sentido para mim.

O script funciona perfeitamente nos diversos navegadores testados (por exemplo, FireFox, Safari, Mobile Safari, Fennec, IE, Chrome, Midori, etc.).

Aqui está o problema:Quero usar o script dentro de um aplicativo para iPhone que está sendo criado com Titanium, mas seu compilador para com erros "usado antes de definido".

Como posso resolver isso?

Esta pode ser uma pergunta estúpida, mas também...Se as funções precisam ser chamadas em uma ordem específica, como resolver o problema de uma função chamada precisar chamar de volta a função que a chamou originalmente?Por exemplo...

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

Se as funções precisarem ser declaradas em ordem, function screen1 precisaria preceder function buildMenu.Mas e se, sob certas condições, a tela1 não puder ser construída e, portanto, quiser exibir novamente o menu (ou seja, chamar uma função que tecnicamente ainda não foi declarada)?

Oh sim...mais uma pergunta:Existem sites ou programas que sequenciam automaticamente as funções, em vez de exigir que o programador faça isso manualmente?

Foi útil?

Solução

Não, a resposta do EM NÃO é a solução certa.Tente executar este JavaScript:

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

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

   foo(); // wrong

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

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

Isso ocorre porque o intérprete primeiro lerá a declaração da função, criará o nome foo como uma função que imprime "certo" e depois lê o var declaração e descobrir que já existe um nome foo então ele irá pular a criação de uma nova variável com o valor undefined, como normalmente acontece.Em seguida, ele processa o código, linha por linha, que inclui uma atribuição para foo.A declaração da função não é reprocessada.Talvez isso se comporte de maneira diferente no Titanium, mas tente no Firebug e você obterá o que consegui.

Uma solução melhor é:

var screen1, buildMenu;

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

Isso também passará no JSLint e produzirá o comportamento correto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top