Say I have the following modules, split across multiple files both capable of extending skillet:
File1.js:
(function(){
var privateVar1 = 0;
var privateFunction1 = function() {
//function definiton
};
skillet.fry() = function() {
//fry it
//matchbox.light();
};
})(window.skillet = window.skillet || {});
File2.js:
(function(){
var privateVar2 = 0;
var privateFunction2 = function() {
//some private function
};
skillet.grillIt = function() {
//grill It
//matchbox.strike(); <-- Shared with File1.js
};
})(window.skillet = window.skillet || {});
Is it possible to have a shared variable/object like matchbox be sharable by the two modules without being bound to window.matchbox or window.skillet.matchbox? I.e. the visibility of matchbox should only be to File1.js and File2.js and must not be accessible elsewhere. I doubt if it’s possible, but is there a way to achieve such a behavior in JavaScript? If not, what’s the best practice to use in this regard?
(It’s more like having a shared event-bus among a set of related modules without exposing that bus globally)
Nope.
“private” variables work in JS only because of the scope that the function was declared in. There is no way to share that scope with a function declared in an entirely different scope. Scope is an unchangeable property of functions, once they are created.
This is why this sort of thing is usually done with
_foostyle properties.The underscore prefix is convention for “internal” and serves as a hint not to mess with it.
You could also get creative with how you pass
matchboxaround though, though in all cases it will mean providing a way to getmatchboxout it’s original scope. Like perhaps, makes askillet.extendmethod that passes the matchbox to it’s argument?Which allows you to use
matchboxoutside it’s original scope in a controlled way. But it also allows anyone to getmatchboxthat maybe shouldn’t.