2012-08-15 14 views
8

vemos este enfoque utilizado todo el tiempo:JavaScript Objeto de ventana siempre accesible?

(function (window) { 
    var document = window.document, 
     location = window.location, 
     navigator = window.navigator; 
})(window) 

Cuando se estudia por encima de fragmento de código Me pregunto por qué un objeto accesible a nivel mundial como window se pasa como argumento a una función. ¿Podría ser que:

  1. El desarrollador no puede saber con certeza al 100% que se puede acceder a la ventana desde el ámbito de la función local?
  2. Es una buena práctica porque deja claras sus intenciones a otros desarrolladores que leen su código.
  3. Has visto a John Resig hacerlo, así que debe chuparse los dedos.

¿Qué opinas?

+2

Duplicado de: http://stackoverflow.com/questions/2716069/how-does-this-javascript-jquery-syntax-work-function-window-undefined –

+0

Sí, parece que estás en lo correcto en ese uno. – ChrisRich

Respuesta

4

Hace que el código sea más portátil.

Puede copiar y pegar el código en un entorno que no tiene un objeto de ventana global definido (por ejemplo, nodo), pero es compatible con API para todo lo que le interesa dentro de su código. Entonces solo tiene que modificar el argumento pasado a la función.

Una ligera modificación que hace que el código más claro:

(function(root){ 
    var document = root.document, 
     location = root.location, 
     navigator = root.navigator; 
})(window) 
2

Sé de un par de posibles razones para el código que se le preguntó sobre: ​​

  1. métodos abreviados Creación de document, location y navigator en variables locales es potencialmente una ligera mejora en el rendimiento y es una reducción en el tipado.

  2. Pasando window en el auto función podría causar referencias a window para realizar un poco mejor que usarlo desde el espacio global de ejecución.

  3. Hay algunos entornos de ejecución de Javascript (no en un navegador) en el que el objeto global no se llama window lo que el código podría adaptarse más fácilmente a eso. Sin embargo, esta razón parece un poco exagerada para ser viable, ya que es muy probable que el código escrito para un navegador use otras capacidades del navegador.

0
(function ($) { }(jQuery)); // $ stands for jQuery within this function 
(function (window) { }(window)); // window still equals window 
(function (bananas) { }(document)); // all references to bananas => document. (silly) 
  1. Normalmente, el nombre de la parte superior es lo que quiere que sea nombrado, mientras que el fondo asegura lo que se supone que representa. Así que tener $ en la parte superior significa que todo el código jQuery (en este caso) permanece con jQuery. Usarlo para ventana/ventana simplemente asegura que ninguna otra definición de ventana cambie su intención original como 'ventana'.
  2. Definitivamente es una mejor práctica y una forma controlada de permitir lo que desea dentro de su función anónima/espacio de nombres.
  3. ¡Una de las razones! Resig es el hombre.
Cuestiones relacionadas