1. As variáveis locais são usadas primeiro e depois declaradas, o que não afeta as variáveis externas com o mesmo nome.
Copie o código do código da seguinte forma:
var x = 1; // --> variável externa x
função fn(){
alert(x); // --> variável local indefinida x é usada primeiro
var x = 2; // declara e atribui mais tarde
}
fn();
alerta(x); // --> 1<BR>
O primeiro ponto é que a primeira frase na função fn produz x, e x é definido na segunda frase. Isso é permitido em JS e permitido aqui significa que o programa pode ser executado sem erros de sintaxe.
Mas não é permitido em outras linguagens como C e Java. Variáveis devem ser declaradas antes do uso, como
Copie o código do código da seguinte forma:
teste de classe pública {
public static void main(String[] args) {
System.out.println(x); //Usar primeiro
int x = 10; // Pós declaração
}
}
Em Java, o compilador exibirá um erro e o programa não poderá ser executado.
O segundo ponto é que a variável local x dentro da função fn não afetará a variável externa x. Ou seja, a saída do alerta em fn não é 1, mas indefinida.
Segundo, os parâmetros formais têm prioridade mais alta que os nomes das funções.
Copie o código do código da seguinte forma:
função fn(fn){
alerta(fn);
}
fn('olá'); // --> "olá"
Você pode ver que o nome da função e o parâmetro formal têm o mesmo nome de fn, e a saída é a string "hello", mas não o corpo da função (fn.toString()) da função fn.
Terceiro, os parâmetros formais têm maior prioridade que os argumentos.
Copie o código do código da seguinte forma:
função fn(argumentos){
alerta(argumentos);
}
fn('olá'); // --> "olá"<BR>
O objeto de argumentos pode ser usado diretamente na função e é um identificador especial fornecido pela própria linguagem.
Aqui acontece que o parâmetro formal é declarado com o mesmo nome. Você pode ver que a saída é "hello" em vez de "[object Object]", ou seja, os argumentos dos parâmetros formais cobrem os argumentos reais fornecidos pela própria linguagem.
4. Os parâmetros formais têm maior prioridade do que as variáveis locais que são declaradas mas não atribuídas.
Copie o código do código da seguinte forma:
função fn(a){
var a;
alerta(a);
}
fn('olá'); // --> "olá"
O parâmetro formal da função fn é a. A primeira frase da função apenas declara a variável local a, mas não atribui um valor. Pelo fato de o resultado de saída ser "hello" em vez de indefinido, pode-se ver que o parâmetro formal a tem uma prioridade mais alta do que a variável local a que é apenas declarada, mas sem valor atribuído.
5. Variáveis locais declaradas e atribuídas têm maior prioridade que parâmetros formais.
Copie o código do código da seguinte forma:
função fn(uma){
var a = 1;
alerta(a);
}
fn('olá'); // --> "1"
O parâmetro formal da função fn é a. A primeira frase da função apenas declara a variável local a e atribui a ela o valor 1. A partir do resultado de saída é "1" em vez de "hello", podemos ver que a variável local declarada e atribuída a tem uma prioridade mais alta do que o parâmetro formal a.
6. Quando parâmetros formais são atribuídos a variáveis locais com o mesmo nome
Copie o código do código da seguinte forma:
função fn(a){
var a = a;
alerta(a);
}
fn('olá');
Não execute ainda, adivinhe o resultado. Se você seguir o ponto 5: as variáveis locais declaradas e atribuídas têm prioridade mais alta que os parâmetros formais. Então a será indefinido. Mas na verdade a é "olá", ou seja, o a direito é o parâmetro formal a, e o a esquerdo é a variável local a.
Os dois as aqui não interferem um no outro e nenhum cobre o outro. Isto é contraditório com o que acabei de dizer: variáveis locais atribuídas têm maior prioridade do que parâmetros formais. Mas o mecanismo faz o que queremos, porque não queremos que a seja indefinido após var a = a.