Al usar símbolos (funciones, constantes, variables globales) definidos en otros archivos JavaScript, los paso a la "función de alcance" del archivo actual (función de alto nivel, generalmente anónimo, que evita la contaminación global del espacio de nombres) como parámetros:
Como se puede ver en la captura de pantalla, ReSharper (6.0.2202.688) está contento con jQuery
, ContainerA
y ContainerB
a pesar de que no se definen en cualquier parte del archivo actual. El comentario en la línea 1 está solo ahí para JSLint (sin errores).
Esta técnica supone que todos los demás archivos JavaScript siguen el JavaScript mejores prácticas de mínimamente contaminar el espacio de nombres global mediante la definición de un único objeto de nivel superior que contiene todos los ( públicos) símbolos exportados (es decir jQuery
es la única mundial objeto para la biblioteca jQuery y sus complementos, ContainerA
es el único objeto global para LibraryA, ContainerB
es el único objeto global para LibraryB, etc.).
Debido a que claramente no tiene control sobre los métodos Web ASP.NET generar funciones constructoras en espacio de nombres global, en su caso de tener que recurrir al recipiente final, window
:
Esto es una ligera variación en la técnica sugerida por @sethobrien en su comentario. Una ventaja importante (en mi humilde opinión) es que no está codificando window.X
en su código. En cambio, su código está creando instancias de clases desde el contenedor aspNet
(que en este momento es sinónimo de window
, pero que podría cambiar en el futuro). Además, tener aspNet.X
en el código declara su intención más claramente para las personas que leerán su código en el futuro. Finalmente, las variables locales pueden acortarse mediante minimizadores de JavaScript produciendo archivos ligeramente más pequeños que se transmiten a los navegadores de los clientes.
Buena pregunta. Parece una advertencia extraña porque esa línea en sí misma no declara nada. Si X no está definido, obtendrá un error en el tiempo de ejecución; si X se declara en otro lugar, deberías recibir la advertencia en otro lugar. – nnnnnn
Es el motor R # JS que dice "Oye, no reconozco X - ¿X realmente debería estar aquí?" Tiene mucho sentido en los casos en que escribe "XY", pero realmente significa "X" y R # guarda su tocino. El problema es que no veo una manera de decirle a R # "sí, ¡esto realmente DEBERÍA estar aquí!" – rythos42
¿Todavía se queja si cambia 'X' a' window.X'? Una idea alternativa: en C#, puede envolver una línea problemática en '// resharper disable whatever' y' // resharper enable whatever' (no recuerdo exactamente), por lo que espero que hagan algo similar para js. O podría definir explícitamente la variable en el ámbito global: 'var X = window.X || {}; '. – sethobrien