Declarando variables ​​sem var keyword

Na w3schools está escrito:

Se você declarar uma variável, sem usar “var”, a variável sempre se tornará GLOBAL.

É útil declarar variável global dentro da function? Eu posso imaginar para declarar algumas variables ​​globais em algum manipulador de events, mas o que é bom para? Melhor uso de RAM?

Não, não há benefício de RAM ou algo parecido.

O que w3schools está falando é algo que eu chamo de The Horror of Implicit Globals . Considere esta function:

function foo() { var variable1, variable2; variable1 = 5; varaible2 = 6; return variable1 + variable2; } 

Parece bastante simples, mas retorna NaN , não 11 , por causa do erro de digitação na varaible2 = 6; linha. E cria uma variável global com o nome do typo’d:

 function foo() { var variable1, variable2; variable1 = 5; varaible2 = 6; return variable1 + variable2; } console.log(foo()); // NaN console.log(varaible2); // 6?!?!?! 

Efeitos colaterais ao esquecer var

Há uma ligeira diferença entre globals implícitos e definidos explicitamente. A diferença está na capacidade de indefinir essas variables ​​usando o operador delete:

• Globals criados com var (aqueles criados no programa fora de qualquer function) não podem ser excluídos.

• Globals implícitos criados sem var (independentemente de serem criados dentro de funções) podem ser excluídos.

Isso mostra que os globais implícitos não são tecnicamente variables ​​reais, mas são propriedades do object global. As propriedades podem ser excluídas com o operador delete, enquanto as variables ​​não podem:

 // define three globals var global_var = 1; global_novar = 2; // antipattern (function () { global_fromfunc = 3; // antipattern }()); // attempt to delete delete global_var; // false delete global_novar; // true delete global_fromfunc; // true // test the deletion typeof global_var; // "number" typeof global_novar; // "undefined" typeof global_fromfunc; // "undefined" 

No ES5 modo estrito, atribuições a variables ​​não declaradas (como os dois antipadrões no fragment anterior) lançará um erro.

Padrões de JavaScript, por Stoyan Stefanov (O’Reilly). Copyright 2010 Yahoo !, Inc., 9780596806750.

O único uso de variables ​​globais é se você precisar acessá-las globalmente. Nesse caso, você deve declará-los usando a palavra-chave var fora das funções, para deixar claro que você realmente deseja criar variables ​​globais e não apenas esqueceu o var ao tentar declarar uma variável local.

Geralmente você deve tentar escopo seu código para que você precise o mínimo possível no escopo global. Quanto mais variables ​​globais você usar em seu script, menor será a chance de usá-lo ao lado de outro script.

Normalmente, as variables ​​em uma function devem ser locais, para que elas desapareçam quando você sair da function.

Às vezes é útil criar novas propriedades acessíveis globalmente dentro de funções que podem ser facilmente acessadas referenciando o object window (todas as propriedades declaradas globalmente são anexadas ao object window).

No entanto, como geralmente é com declarar qualquer coisa para ser globalmente acessível, pode levar a problemas mais tarde, porque essas propriedades podem ser facilmente substituídas etc. É muito melhor simplesmente passar valores para funções como argumentos e recuperar seus resultados.

O principal problema é que alguém já pode estar usando um global com o mesmo nome.

Então, quando você alterar o valor do global, você sobrescreverá seu valor.

Mais tarde, quando o global for usado em seguida, ele terá mudado misteriosamente.

Eu diria que isso pode prejudicar sua segurança e até a estabilidade do seu código.

Como foi mencionado acima, você pode cometer um erro simplesmente digitando erroneamente suas variables ​​e uma solução é a palavra-chave "use strict";
Com essa palavra-chave declarada, você lançará um erro: Uncaught ReferenceError: foo is not defined .

Também se refere a um código seguro:
1. Ao escrever um código seguro, não queremos que nossas variables ​​sejam acessadas em qualquer lugar além de onde elas foram realmente declaradas. Não declare variables ​​globais sem a necessidade.
2. Leia sempre os avisos cuidadosamente e resolva-os. Use "use strict"; , JSlint e outras ferramentas para ver e resolver o aviso para melhorar seu código.