teniendo problemas para conseguir lo siguiente para pasar JSLint/jshintViolación estricto usando esta palabra clave y revelando el diseño del módulo
/*jshint strict: true */
var myModule = (function() {
"use strict";
var privVar = true,
pubVar = false;
function privFn() {
return this.test; // -> Strict violation.
}
function pubFn() {
this.test = 'public'; // -> Strict violation.
privFn.call(this); // -> Strict violation.
}
return {
pubVar: pubVar,
pubFn: pubFn
};
}());
myModule.pubFn();
entiendo que está siendo causado por el uso de this
en una declaración de la función, pero leí algo Crockford escribió y dijo que la violación está destinada a prevenir la contaminación variable global, pero la única variable global aquí es la que estoy definiendo explícitamente ... myModule
. Todo lo demás se mantiene en el alcance de la función inmediata, y debería poder usar this
para referirme al módulo.
Alguna idea de cómo puedo obtener este patrón para pasar?
Actualización: si utilizo una expresión de función en lugar de una declaración, esto parece funcionar, es decir
var pubFn = function() { ...
No soy un fan de este formato, sin embargo, prefieren tener el nombre de la función y nombraron a los params más cerca y la declaración parece/se siente más limpia. Honestamente, no veo por qué esto está arrojando la violación, no hay ninguna razón para ello en este patrón.
Suena como uno de esos casos en los que simplemente puede ignorar las quejas de jslint. Como un aparte, ¿cómo funciona 'pubVar' cuando se accede como' myModule.pubVar'? Realmente no da código fuera del acceso al modelo a la variable en el módulo ¿verdad? Pensaría que si realmente quieres obtener/establecer el valor actual de la variable del módulo, necesitarías funciones getter y setter. – nnnnnn
tienes razón, pensé que se veía un poco gracioso. Si intentabas 'myModule.pubVar = true', simplemente volverías a escribir la propiedad en el objeto. El 'pubVar' interno se mantendría como' falso' –
Respecto a la actualización: prefiero 'var foo = function() {}' a 'función foo() {}' porque ayuda a evitar problemas de alojamiento. Además, me gusta que * does * haga que las funciones se parezcan más a otras variables, ya que en JS no hay diferencia entre una función o cualquier otro valor; son de primera clase. Preferencia personal, lo sé, pero pensé en arrojar algunos pensamientos. – JAAulde