2012-07-20 17 views
14

¿Las variables globales están almacenadas en un objeto específico? Por ejemplo:¿En qué objeto se almacenan las variables globales de Javascript?

var test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

Los tres de estas pruebas resultan en undefined, por lo que no es un objeto que contiene estas variables?

Siento que esto es algo estúpido que ya debería saber, pero ni siquiera puedo encontrar la respuesta en línea.

+3

Respuesta corta: cómo se refiere a la variable global depende de su entorno. –

+1

¿Qué quiere decir exactamente con "medio ambiente"? El navegador, el alcance, el sistema operativo? – twiz

+0

JavaScript se puede ejecutar en navegadores, en Adobe Photoshop, en navegadores VRML antiguos, dentro de motores que puede incorporar en programas Java y muchos otros sistemas host. Llamamos a estos los "entornos de host". Entonces sí, podría ser un navegador. Los programas de JavaScript manipulan objetos de estos entornos. –

Respuesta

15

Creo que encontrará en la mayoría de los buscadores, ellos son almacenados en window.

Intento de depuración psíquico descabellado: ¿has probado esto en jsFiddle? ¿O tal vez en Firebug? Si es así, probablemente esté viendo undefined para las tres porque en ese caso el código se ejecuta en un marco; por lo que tiene un window objeto diferente (creo) el código es realmente envuelto:

window.addEvent('load', function() { 
    var test="stuff"; 
    console.log(window.test); 
    console.log(document.test); 
    console.log(this.test); 
}); 

Se puede ver en el fragmento anterior de jsFiddle que test es no una variable global, lo que explica por qué hasn' ha sido adjuntado al window.

No soy un experto, pero esta respuesta parece ser precisa por lo que puedo decir en Chrome, Firefox, Safari y Opera. Para verificarlo, he creado un archivo HTML con el siguiente contenido y la cargué en cada navegador: lo suficientemente

<script type="text/javascript"> 
    var test = "stuff"; 
    alert(window.test); 
</script> 

Claro, "cosas" cada vez.

+0

Sabía que había una razón por la que pensé "esto es algo estúpido que ya debería saber". Tienes razón, estaba usando jsFiddle ... Gracias por apuntarme en la dirección de mi propia estupidez. jaja – twiz

+3

Lejos de ser estúpido, esa fue una buena pregunta. –

+0

Estoy con Ray; Definitivamente es una buena pregunta. De hecho, es algo extraño, cuanto más lo pienso, esta respuesta es realmente cierta. –

5

Una variable global "verdadera" no tiene la palabra clave "var". Prueba esto:

test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

Con esto, todos los ámbitos de la verán. Las variables con la palabra clave var son locales al alcance que se declararon.

Una variable será "global a la ventana" (propiedad del objeto ventana) solo si la declara en el ámbito de la ventana como dijo Dan, haciéndola global para los navegadores que generalmente usan la ventana como ámbito global.

+1

¿Un global "verdadero"? Si usa 'var' en el alcance global, crea una variable global. – nnnnnn

+0

@nnnnnn El uso de las comillas dobles fue intencional;) ​​ – davidbuzatto

+0

Interesante. Intenté esto en jsfiddle, y en cambio obtuve "cosas", "indefinido", "cosas". Y el primero y el último son iguales porque 'this === window'. http: // jsfiddle.net/5Xtaq/1/ –

2

Las variables globales se almacenan en la variable global window. El siguiente código funciona si sólo se declara fuera nada (como una función):

var test="stuff"; 
console.log(window.test); 

prueba similar es el window.location.href es lo mismo que location.href

Sin embargo, el problema puede estar en donde se declaró la variable . Por ejemplo, si usted declaró esta variable en la función, un viaje de solo existe en la función, y no globalmente:

function foo(){ 

    //declaring inside function 
    var test="stuff"; 

    //undefined, since the variable exists in the function only 
    console.log(window.test); 

    //undefined, document refers to the document 
    //which is the top DOM object, not the global window 
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function 
    //For normal function calls, usually it points to window as well 
    console.log(this.test); 

    //none of the above refer to "test" that contains "stuff" 
    //because you are looking in the wrong place 

} 
+0

Es la palabra clave 'var', [@davidbuzatto] (http://stackoverflow.com/a/11573012/143295) tenía buen ojo. – Nicole

17

Aquí es una respuesta tardía pero técnica.

le preguntas

son variables globales almacenados en el objeto específico?

La respuesta es sí; se almacenan en algo llamado, oficialmente, el objeto global. Este objeto se describe en la Sección 15.1 del official ECMAScript 5 Specification.

No se requiere que el objeto global tenga un nombre; pero puede consultar sus propiedades, como String, isNaN, y Date simplemente usando su nombre. Su entorno host JavaScript colocará otras propiedades en el objeto global además de las requeridas por la especificación ECMAScript, como alert o console. En un navegador, puedo escribir el guión

alert("Hello world"); 

porque alert es una propiedad del objeto global.

Tenga en cuenta que no tiene que haber una forma de acceder a este objeto global en absoluto, créalo o no. Lo bueno, sin embargo, es que muchos entornos host colocarán una propiedad en el objeto global cuyo valor es una referencia al objeto global en sí. En la mayoría de los buscadores web, esta propiedad se llama window. Así podemos escribir:

alert("Hello"); 
window.alert("Hello"); 
window.window.alert("Hello"); 
window.window.window.window.window.alert("Hello"); 

y también podemos decir:

var x = 5; 
alert(this.x); 

y obtener 5 alertados.

Cuestiones relacionadas