Escopo de variáveis e constantes
JScript possui três escopos: global, local e a classe. Se você declarar uma variável ou constante fora de uma definição de função ou classe, é uma variável global e seu valor é acessível e modificável em todo o programa. Se você declarar uma variável dentro de uma definição de função, essa variável é local. Ele é criado e destruído toda vez que a função é executada; não pode ser acessado de fora da função. Se você declarar uma variável dentro de uma definição de classe, que a variável está disponível dentro da classe, e não pode ser acessado diretamente a partir do escopo global. Para obter mais informações, consulte Objetos baseados em classe.
Discussão
Linguagens como C++ também têm o "escopo de bloco; qualquer conjunto de chaves ({}) define um novo escopo. JScript não oferece suporte a escopos de bloco.
Uma variável local pode ter o mesmo nome de uma variável global, mas é totalmente distinta e separada. Conseqüentemente, a alteração do valor de uma variável não tem efeito sobre o outro. Dentro da função na qual a variável local é declarada, somente a versão local tem significado. Isso é conhecido como visibilidade.
// Define two global variables.
var name : String = "Frank";
var age : int = "34";
function georgeNameAge() {
var name : String; // Define a local variable.
name = "George"; // Modify the local variable.
age = 42; // Modify the global variable.
print(name + " is " + age + " years old.");
}
print(name + " is " + age + " years old.");
georgeNameAge();
print(name + " is " + age + " years old.");
A saída deste programa mostra que uma variável local pode ser modificada sem alterar o valor da variável global. As alterações a variável global de dentro da função afetam o valor no escopo global.
Frank is 34 years old.
George is 42 years old.
Frank is 42 years old.
Desde JScript processa as declarações de variáveis e constantes antes de executar qualquer código, não importa se a declaração é dentro de um bloco condicional ou alguma outra construção. Depois que o JScript descobriu-se a todas as variáveis e constantes, ele executa o código na função. Isso significa que o valor de uma constante local é indefinido, até que a instrução de declaração de constante seja atingida e que uma variável local é indefinida, até que a variável é atribuída para a função.
Às vezes, isso resulta em comportamentos inesperados. Considere o seguinte programa.
var aNumber = 100;
var anotherNumber = 200;
function tweak() {
var s = "aNumber is " + aNumber + " and ";
s += "anotherNumber is " + anotherNumber + "\n";
return s;
if (false) {
var aNumber; // This statement is never executed.
aNumber = 123; // This statement is never executed.
const anotherNumber = 42; // This statement is never executed.
} // End of the conditional.
} // End of the function definition.
print(tweak());
Esta saída deste programa é:
aNumber is undefined and anotherNumber is undefined
Você pode esperar que aNumber seria 100 ou 123 e que anotherNumber seria 200 ou 42, mas os dois valores são indefinido. Desde que ambos aNumber e anotherNumber são definidos com escopo local, eles sombra a variável global e a constante com o mesmo nome. Desde que o código que inicializa a variável local e a constante nunca é executado, seus valores são indefinido.
Declaração de variável explícita é necessária no modo rápido. Quando o modo rápido estiver desativado, a declaração de variável implícita é necessária. Uma variável declarada implicitamente dentro de uma função — ou seja, aquele que aparece no lado esquerdo de uma expressão de atribuição sem a palavra-chave var — é uma variável global.