Pregunta ¿Hay alguna diferencia entre una variable global y una propiedad del objeto global


Estaba leyendo el siguiente análisis de David Mark sobre el marco js "Sencha": https://gist.github.com/3279190 y allí dice ...

Lo que querían era una variable global, pero terminaron siendo una propiedad del Objeto Global. Según las especificaciones y (y el historial de implementación) hay suficientes diferencias entre los dos que se requiere cuidado para no mezclarlos (como se hace aquí).

... pero hasta donde yo sabía, no había ninguna diferencia entre var my_global = 123; y (en un entorno de navegador) window.my_global = 123; (en ese ejemplo asumí que el entorno era un navegador, de ahí el uso de window, pero podría haber usado this.my_global en cambio, obviamente el Objeto Global sería diferente cuando se ejecuta en diferentes entornos).

Pero ignorando esa pequeña discrepancia, ¿existe alguna diferencia entre asignar una propiedad al Objeto Global y crear una variable global? Pensé que no, y que crear una variable global era solo otra manera de asignar una propiedad al Objeto Global.

Creo que puede haber un problema en algunos navegadores si tenían un elemento con una identificación de "my_global", entonces aparentemente eso puede causar problemas con JavaScript haciendo referencia a lo correcto, pero no estoy seguro de cómo / qué causa ese problema (por ejemplo, asignar una propiedad al objeto global causa que ocurra el problema de identificación del elemento, o está declarando una variable global que causa el problema de identificación del elemento?)

¿Alguien puede aclarar esto por favor?


9
2017-09-15 16:47


origen


Respuestas:


Una variable creada usando var en el alcance global crea una propiedad del objeto global. Sin embargo, esta propiedad tiene un comportamiento diferente de una propiedad del objeto global que no se ha creado utilizando var.

En primer lugar, existe una diferencia en cómo se ejecuta una declaración de variable: a var declaración en el ámbito global crea una propiedad del objeto global antes de ejecutar cualquier código, un efecto comúnmente conocido como elevando, bien documentado en la web (ver referencias a continuación).

En segundo lugar, la variable global, a diferencia de una propiedad del objeto global que no se ha creado con var, no se puede eliminar con el delete operador (aunque esto es no es cierto en versiones anteriores de IE) delete no se puede usar para borrar variables. Esta diferencia se debe a interna atributos de propiedad que toda propiedad de objeto tiene. Estos atributos se especifican en la especificación ECMAScript. En términos de ECMAScript 5, var foo = "bar" crea una propiedad foo del objeto global con el [[Configurable]] atributo false mientras this.foo = "bar" (en el alcance global) crea un foo propiedad con [[Configurable]] atributo true.

Referencias


8
2017-09-17 09:48



No estoy al tanto de ninguna diferencia práctica, pero seguro hay alguna diferencia entre la referencia como global o como window.var. Un simple ejemplo:

'use_strict';
console.info (window.foo);
console.info (foo);

window.foo simplemente devolverá indefinido. foo dará indefinido como error. Entonces sí, son diferentes. Pero en buen código (mi ejemplo es código muy malo) no parece que haya ninguna diferencia. (pero si hay, realmente me gusta saber más al respecto :))


0
2017-09-15 19:42



var count = 123

var global_object = {
    count:var = 456
console.log(this.count) //returns 456

}

console.log(count) //returns 123

console.log(global_object) //returns 456

Arriba, el conteo se define primero como una variable global. Entonces, se define como una propiedad dentro del objeto global. La definición dentro del objeto global es local para ese objeto.

Veo un problema con mi respuesta ahora que no se me ocurrió la primera vez que publiqué esto. En la respuesta más votada arriba, observo que, correctamente, se muestra que en el caso de la variable global en la pregunta "var" se usa en su definición, pero en el caso del objeto global, no se usa "var". Todavía esperaría que el alcance entrara en juego aquí (lo haría en ActionScript).

Tengo un par de otros problemas con el ejemplo anterior. count: var = es simplemente incorrecto para mí. Tal vez debería ser var count = 456. Sin embargo; Todavía esperaría que una variable declarada dentro de una función solo tenga alcance dentro de esa función. Entonces las expresiones console.log en el ejemplo deberían ser verdaderas.


-2
2017-09-15 17:19