2012-04-11 23 views
6

En javascriptwindow es el objeto global, lo que significa que cada objeto en el ámbito global es un elemento secundario de window. Entonces ¿por qué me da este resultado:ReferenceError y el objeto global

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

Esas dos líneas deben ser los mismos, no habrían de hacerlo?

Respuesta

17

Porque con window.foo está buscando explícitamente la propiedad foo del objeto window que no es el caso en la última opción. En la última opción, si no está definido foo, usted como desarrollador debe saber que no está definido y recibir la advertencia clara de error en lugar de que el intérprete la configure en undefined (como en el primer caso) que conducirá a resultados inesperados.

Reference Error:

representa un error cuando se hace referencia a una variable inexistente. Se lanza un error de referencia cuando se intenta desreferenciar una variable que no se ha declarado.

Echa un vistazo a este artículo para obtener más información:

Citando desde arriba artículo:

Una referencia se considera irresoluble si su valor base no está definido. Por lo tanto, una referencia de propiedad no se puede resolver si el valor anterior al punto no está definido. El siguiente ejemplo arrojaría un ReferenceError pero no lo hace porque TypeError llega primero. Esto se debe a que el valor base de una propiedad está sujeto a CheckObjectCoercible (ECMA 5 9.10 a través de 11.2.1) que arroja un TypeError cuando intenta convertir un tipo no definido a un objeto.

Ejemplos:

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

Las referencias que no son ni propiedades o variables son, por definición, no se puede resolver y arrojarán un ReferenceError, Así:

foo; //ReferenceError 
2

En su primer ejemplo (window.foo) está accediendo a una propiedad del objeto ventana. JavaScript devuelve "indefinido" para cuando intenta acceder a una propiedad no existente de un objeto. Está diseñado de esa manera.

En el segundo ejemplo, hace referencia directamente a una variable y, como no existe, se produce un error.

Así es como JavaScript está diseñado y funciona.

1

En JavaScript puede asignar campos objeto sobre la marcha de esa manera, por lo que window.foo es casi (ver comentarios más abajo) equivalente a var foo;cuando está definido en el contexto global, mientras que llamar foo de manera inesperada hace que el navegador entre en pánico porque ni siquiera sabe qué objeto buscar. Aviso, si lo hace:

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo' no es equivalente a' var foo'. –

+0

@TimDown. ¿Puedes elaborar un poco más, por favor? tal vez en una respuesta? – gdoron

+0

@TimDown & @gdoron Bien, eso es un poco falso, lo que quise decir es window.foo es equivalente a 'var foo' cuando se declara en el contexto global. – JKing

Cuestiones relacionadas