Chamar funçao antes da declaração

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 :wink:

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…

vlww mesmo galera 8)

Precisando, estamos ai !

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. :slight_smile:

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. :slight_smile:

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. :slight_smile:

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. :slight_smile:

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. :slight_smile:

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.