2009-07-17 23 views
5

¿Hay algún beneficio al usar el prefijo 'ventana' al llamar variables o métodos de JavaScript en el objeto ventana? Por ejemplo, ¿llamar a 'window.alert' tendría una ventaja sobre simplemente llamar a 'alerta'? Me imagino que usar el prefijo podría dar un pequeño aumento de rendimiento cuando la llamada se realiza desde el interior de alguna función/objeto, sin embargo, rara vez veo esto en el código de las personas. De ahora en adelante esta pregunta.Beneficio de usar el prefijo 'ventana' en javascript

+0

alerta es una mala ejemplo, porque generalmente solo se llama una vez y no importa (generalmente) cuánto tiempo demora en mostrarse. – Nosredna

Respuesta

6

Dudo que haya algún beneficio medible en el rendimiento. Después de que toda la cadena de alcance fuera escaneada para el identificador window primero, el objeto de ventana se escanearía para el artículo deseado. Por lo tanto, es más probable que sea determinante para el rendimiento.

El uso del prefijo de ventana es útil si tiene otra variable en el alcance que ocultaría el elemento que desea recuperar de la ventana. La pregunta es ¿siempre se puede saber cuándo podría ser? La respuesta es no. Entonces, ¿siempre deberías prefijar con la ventana? ¿Cómo se vería el código si hicieras eso? Feo. Por lo tanto, no lo hagas a menos que sepas que debes hacerlo.

+0

¡No tenía idea de que la cadena de alcance se escaneara para ventana! Siempre pensé que Windows era una palabra clave reservada, y por lo tanto no sucedería. Gracias. –

+1

La cadena de alcance realmente funciona al revés. Las variables locales anulan las globales. – superlukas

0

Imagino que el beneficio de rendimiento aquí es increíblemente insignificante en el mejor de los casos, si es que hay uno.

0

Solo importa si está utilizando marcos y haciendo un montón de llamadas javascript entre marcos, e incluso solo escenarios específicos requieren la necesidad de hacer referencia explícitamente a window.

0

Cuando usa el prefijo, está explicitando que está utilizando la definición "global" de la variable, no una local. (No estoy seguro de si/cómo puede insertar variables en un ámbito en JS, excepto la rareza con este y los controladores de eventos en línea.) YMMV, puede preferir la claridad o encontrar que es un desorden.

5

Obtenido de Google (http://www.techotopia.com/index.php/JavaScript_Window_Object):

El objeto de la ventana es el objeto de nivel superior de la jerarquía de objetos. Como tal, cada vez que se hace referencia a un método o propiedad de objeto en un script sin el nombre del objeto y el prefijo de punto, JavaScript asume que es un miembro del objeto de ventana. Esto significa, por ejemplo, que cuando se llama al método window alert() para mostrar un cuadro de diálogo de alerta, aparece la ventana. el prefijo no es obligatorio. Por lo tanto, las siguientes llamadas a métodos lograr lo mismo:

window.alert()
alerta()

Sin embargo, he leído, pero no han tenido tiempo para probar lo siguiente de: (http://www.javascriptref.com/reference/object.cfm?key=20)

Sin embargo, un lugar donde tendrás que tener cuidado es en los controladores de eventos. Dado que los controladores de eventos están vinculados al documento, una propiedad de documento con el mismo nombre que una propiedad de ventana (por ejemplo, abrir) enmascarará la propiedad de ventana. Por este motivo, siempre debe usar la "ventana" completa. sintaxis al direccionar las propiedades de Ventana en los manejadores de eventos.

+0

+1 informativo =) –

7

Esto es útil cuando se intenta probar valores de objetos globales.Por ejemplo, si GlobalObject no se define a continuación, esto arroja un error:

if(GlobalObject) { // <- error on this line if not defined 
    var obj = new GlobalObject(); 
} 

pero esto no arroja un error:

if(window.GlobalObject) { // Yay! No error! 
    var obj = new GlobalObject(); 
} 

mismo modo con:

if(globalValue == 'something') // <- error on this line if not defined 
if(window.globalValue == 'something') // Hurrah! 

y:

if(globalObj instanceof SomeObject) // <- error on this line if not defined 
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW! 

I w No debería esperar ver una diferencia significativa en el rendimiento, y la única otra razón por la que puede hacerlo es asegurarse de que está obteniendo un valor del alcance global (en caso de que el valor haya sido redefinido en el alcance actual).

1

En cuanto al rendimiento, creo que AnthonyWJones lo tiene cubierto.

Un uso del prefijo de ventana es hacer explícitamente algo disponible fuera del alcance actual. Si estuviera escribiendo código en una función de auto-invocando para no contaminar el ámbito global, pero había algo dentro que quería hacer disponible a nivel mundial, es posible hacer algo como lo siguiente:

(function(){ 
    function foo(){ 
     //not globally available 
    } 
    function bar(){ 
     //not globally available   
    } 
    window.baz = function(){ 
     //is globally available 
     foo(); 
     bar(); 
    }; 
})(); 
+0

'baz = function() {/ * ... * /}' hace lo mismo, y no, AnthonyWJones no lo tiene cubierto. El estándar garantiza que habrá un beneficio de rendimiento mensurable (no solo en JS, sino también en idiomas como Lua), debido a cómo funcionan los ámbitos. – superlukas

Cuestiones relacionadas