Having trouble getting the following to pass jslint/jshint
/*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();
I understand it's being caused by the use of this
in a function declaration, but I read something Crockford wrote and he said the violation is meant to prevent global variable pollution - but the only global variable here is the one I'm explicitly defining... myModule
. Everything else is held in the immediate function scope, and I should be able to use this
to refer to the module.
Any ideas how I can get this pattern to pass?
Update: if I use a function expression instead of a declaration, this seems to work, ie
var pubFn = function () { ...
I'm not a fan of this format though, prefer to have the function name and named params closer and the declaration looks/feels cleaner. I honestly don't see why this is throwing the violation - there's no reason for it in this pattern.
pubVar
work when accessed asmyModule.pubVar
? It doesn't really give code outside the model access to the variable in the module does it? I would've thought that if you want to actually get/set the current value of the module's variable you'd need getter and setter functions. – IcymyModule.pubVar = true
you would just rewrite the property on the object. The internalpubVar
would remain asfalse
– Bauskevar foo = function(){}
tofunction foo(){}
because it helps avoid hosting problems. Also, I like that it does make the functions look more like other vars, since in JS there is no difference between a function or any other value--they're first class. Personal preference, I know--but I thought I'd throw out some thoughts. – Scabious