2010-10-12 10 views
9

Tengo un problema al tratar de hacer que una función sea global cuando está involucrada en el cierre. En el código enumerado a continuación, tengo un método anónimo que define una nueva función en el window llamado, getNameField.Cómo definir una nueva función global en javascript

(function() { 
    function alertError (msg) { 
     alert(msg); 
    } 
    window.getNameField = function (fieldId) { 
     try{ 
      if(!fieldId) { 
       fieldId='name'; 
      } 
      return document.getElementById(fieldId); 
     } catch(e) { 
      alertError(e); 
     } 
    }; 
}()); 

alert(getNameField().value); 

Esto funciona muy bien en el navegador, pero cuando ejecuto el código en JSLint.com con "No permitir variables no definidas" se convirtió en él me da un error.

problema en la línea 17 caracteres de 7: 'getNameField' no está definido.

¿Me puede ayudar a solucionar esto para que JSLint realmente comprenda que esta función debe considerarse global?

+1

"Esto funciona muy bien en el navegador" Entonces, ¿cuál es el problema? –

+0

Solo quería asegurarme de escribir el código según las especificaciones de JavaScript y no utilizar algún tipo de "hack". – Eric

Respuesta

16

Se podría llamar en su lugar como window.getNameField:

alert(window.getNameField().value); 

O se puede definir una variable fuera el cierre:

var getNameField; 

(function(){ 
    getNameField=function(fieldId){ 
     // Code here... 
    }; 
}()); 

alert(getNameField().value); 
+0

En la misma línea, podría crear una variable que actúa como un "espacio de nombre", donde la variable es una matriz asociativa y la función se asigna a una de las entradas en la matriz asociativa. La desventaja, aunque de menor importancia, es que tendría que rediseñar todo mi código para usar la variable "espacio de nombres" si quería mantener la coherencia. – Eric

+1

De hecho, podrías. No hay ningún problema grave con su código tal como está. –

7

me gustaría probar

window["getNameField"] = function(fieldId) { 
+5

Eso hará exactamente ninguna diferencia. –

2

JSLint toma anotar comentarios para este propósito. Lea here al usar un comentario /*global */.

+0

Generalmente, en el código JS quiero evitar el uso de comentarios debido a los caracteres adicionales que se descargan en el navegador. Podría agregar y eliminar continuamente los comentarios, pero tampoco me gusta ese paso manual. – Eric

+3

sí, el archivo es más pequeño si elimina todos los comentarios. también es más pequeño si lo ejecuta a través de un minimizador de JavaScript, que lo hace y acorta todos los nombres de variables y elimina todos los espacios en blanco innecesarios. en cualquier caso, no desea desarrollar usando la versión "minified". tome la diferencia de tamaño insignificante de los comentarios de origen o haga una copia minimizada cuando "implemente". – zem

Cuestiones relacionadas