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
'window.foo' no es equivalente a' var foo'. –
@TimDown. ¿Puedes elaborar un poco más, por favor? tal vez en una respuesta? – gdoron
@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