Galera, é muito mais uma curiosidade do que um problema em si :-o
<script type="text/javascript">
ola();
function ola(){
alert("Olá");
}
</script>
Por que nesse caso posso chamar a função antes dela ser interpretada pelo navegador?
vlww
Ola, é algo muito simples de ser respondido,
o JavaScript não funciona de forma de LINEAR ou seja “Executa a lina 1, executa linha 2 e etc…”
Voce chamando a Function ola();
o javaScript por assim dizendo, vai procurar dentro do seu text/Javascript ate encontrar a declaração da function, independente de estar em cima ou embaixo.
espero ter ficado claro 
Pelo que sei, no momento em que se carrega a página, todas as funções já foram indexada, quando se chama a função tal, ele busca nesse indice e executa a função…
O nome disto é hoisting. As variáveis e funções são sempre movidas para o início do escopo (lembre-se que em javascript o escopo é a nível de funções, não de blocos).
Na verdade o código javascript executa de maneira linear, só nestes casos isto não ocorre por que as variáveis/funções são movidas para o início. O javascript não sai procurando definições no código. 
Entretanto é boa prática em javascript declarar as variáveis sempre no início do escopo (função), pra não haver enganos no decorrer do código.
[quote=wagnerfrancisco]O nome disto é hoisting. As variáveis e funções são sempre movidas para o início do escopo (lembre-se que em javascript o escopo é a nível de funções, não de blocos).
Na verdade o código javascript executa de maneira linear, só nestes casos isto não ocorre por que as variáveis/funções são movidas para o início. O javascript não sai procurando definições no código. 
Entretanto é boa prática em javascript declarar as variáveis sempre no início do escopo (função), pra não haver enganos no decorrer do código.[/quote]
Muito interessante saber esse conceito de hoisting, com certeza irei pesquisar mais sobre. vlww
[quote=wagnerfrancisco]O nome disto é hoisting. As variáveis e funções são sempre movidas para o início do escopo (lembre-se que em javascript o escopo é a nível de funções, não de blocos).
Na verdade o código javascript executa de maneira linear, só nestes casos isto não ocorre por que as variáveis/funções são movidas para o início. O javascript não sai procurando definições no código. 
Entretanto é boa prática em javascript declarar as variáveis sempre no início do escopo (função), pra não haver enganos no decorrer do código.[/quote]
wagnerfrancisco, nesse caso porém não estamos dentro de um escopo de uma função, mesmo assim esse comportamento continua?
Por “de baixo dos panos” ficaria assim:
<script type="text/javascript">
function ola(){
alert("Olá");
}
ola();
</script>
[quote=dntalemao][quote=wagnerfrancisco]O nome disto é hoisting. As variáveis e funções são sempre movidas para o início do escopo (lembre-se que em javascript o escopo é a nível de funções, não de blocos).
Na verdade o código javascript executa de maneira linear, só nestes casos isto não ocorre por que as variáveis/funções são movidas para o início. O javascript não sai procurando definições no código. 
Entretanto é boa prática em javascript declarar as variáveis sempre no início do escopo (função), pra não haver enganos no decorrer do código.[/quote]
wagnerfrancisco, nesse caso porém não estamos dentro de um escopo de uma função, mesmo assim esse comportamento continua?
Por “de baixo dos panos” ficaria assim:
[code]
[/code][/quote]
Sim, javascript tem dois tipos de escopo: global e local. Local é quando você declara variáveis/funções dentro de uma função. Global é quando você declara fora de qualquer função. Ainda, se você não declarar a variável (usando var) dentro de uma função (simplesmente atribuir um valor) ela é global também (e isso é considerado um defeito da linguagem).
Independente de ser global ou local, o hoisting funciona da mesma maneira, as variáveis são movidas para o início do escopo. Mas o ideal é sempre evitar o uso de variáveis globais.
[quote=wagnerfrancisco][quote=dntalemao][quote=wagnerfrancisco]O nome disto é hoisting. As variáveis e funções são sempre movidas para o início do escopo (lembre-se que em javascript o escopo é a nível de funções, não de blocos).
Na verdade o código javascript executa de maneira linear, só nestes casos isto não ocorre por que as variáveis/funções são movidas para o início. O javascript não sai procurando definições no código. 
Entretanto é boa prática em javascript declarar as variáveis sempre no início do escopo (função), pra não haver enganos no decorrer do código.[/quote]
wagnerfrancisco, nesse caso porém não estamos dentro de um escopo de uma função, mesmo assim esse comportamento continua?
Por “de baixo dos panos” ficaria assim:
[code]
[/code][/quote]
Sim, javascript tem dois tipos de escopo: global e local. Local é quando você declara variáveis/funções dentro de uma função. Global é quando você declara fora de qualquer função. Ainda, se você não declarar a variável (usando var) dentro de uma função (simplesmente atribuir um valor) ela é global também (e isso é considerado um defeito da linguagem).
Independente de ser global ou local, o hoisting funciona da mesma maneira, as variáveis são movidas para o início do escopo. Mas o ideal é sempre evitar o uso de variáveis globais. [/quote]
vlww mesmo, muito boa a explicação.