Al declarar variables en Javascript, aunque declarar con la palabra clave var o sin ella a menudo no causa problemas en la ejecución, estas dos formas siguen teniendo diferencias. Que un código pueda ejecutarse correctamente no significa que sea el código adecuado.
var num = 1;
Es declarar una variable en el ámbito actual. Si se declara dentro de un método, es una variable local (local variable); si se declara en el ámbito global, es una variable global.
Y
num = 1;
En realidad es una operación de asignación de propiedad. Primero, intenta resolver num en la cadena de ámbitos actual (si se declara dentro de un método, la cadena de ámbitos actual representa el ámbito global y el ámbito local del método, etc...). Si encuentra num en cualquier cadena de ámbitos actual, ejecuta la asignación a la propiedad num; si no encuentra num, entonces crea la propiedad num en el objeto global (es decir, el objeto de nivel más alto de la cadena de ámbitos actual, como el objeto window) y le asigna un valor.
¡Atención! No declara una variable global, sino que crea una propiedad del objeto global.
Aun así, puede que todavía te resulte difícil entender la diferencia entre "declaración de variable" y "creación de propiedad de objeto" en este contexto. De hecho, la declaración de variables, la creación de propiedades y cada propiedad en Javascript tienen ciertos indicadores que describen sus atributos, como solo lectura (ReadOnly), no enumerable (DontEnum), no eliminable (DontDelete), etc.
Dado que la declaración de variables lleva inherentemente el atributo no eliminable, compara var num = 1 con num = 1: el primero es una declaración de variable, que tiene el atributo no eliminable, por lo que no se puede eliminar; el segundo es una propiedad de una variable global, por lo que se puede eliminar de la variable global.
// num1为全局变量,num2为window的一个属性
var num1 = 1;
num2 = 2;
// delete num1; 无法删除
// delete num2; 删除
function model(){
var num1 = 1; // 本地变量
num2 = 2; // window的属性
// 匿名函数
(function(){
var num = 1; // 本地变量
num1 = 2; // 继承作用域(闭包)
num3 = 3; // window的属性
}())
}
PD: En el estándar ECMAScript 5, existe un "modo estricto" (Strict Mode). En el modo estricto, asignar un valor a un identificador no declarado lanzará un error de referencia, lo que puede prevenir la creación accidental de propiedades de variables globales. Actualmente, algunas versiones nuevas de navegadores ya lo soportan.