The only way to truly get access to function a‘s private scope is to declare b inside of a so it forms a closure that allows implicit access to a‘s variables.
Here are some options for you.
Direct Access
-
Declare
binside ofa.function a() { var x = 5, obj = {}; function b(){ // access x or obj... } b(); } a(); -
If you don’t want
binside ofa, then you could have them both inside a larger container scope:function container() { var x, obj; function a(){ x = 5; obj = {..}; b(); } function b(){ // access x or obj... } } container.a();
These are the only ways you’re going to be able to use a‘s variables directly in b without some extra code to move things around. If you are content with a little bit of “help” and/or indirection, here are a few more ideas.
Indirect Access
-
You can just pass the variables as parameters, but won’t have write access except to properties of objects:
function a() { var x = 5, obj = {}; b(x, obj); } function b(x, obj){ // access x or obj... // changing x here won't change x in a, but you can modify properties of obj } a();As a variation on this you could get write access by passing updated values back to
alike so:// in a: var ret = b(x, obj); x = ret.x; obj = ret.obj; // in b: return {x : x, obj : obj}; -
You could pass
ban object with getters and setters that can accessa‘s private variables:function a(){ var x = 5, obj = {..}, translator = { getX : function() {return x;}, setX : function(value) {x = value;}, getObj : function() {return obj;}, setObj : function(value) {obj = value;} }; b(translator); } function b(t){ var x = t.getX(), obj = t.getObj(); // use x or obj... t.setX(x); t.setObj(obj); // or you can just directly modify obj's properties: obj.key = value; } a();The getters and setters could be public, assigned to the
thisobject ofa, but this way they are only accessible if explicitly given out from withina. -
And you could put your variables in an object and pass the object around:
function a(){ var v = { x : 5, obj : {} }; b(v); } function b(v){ // access v.x or v.obj... // or set new local x and obj variables to these and use them. } a();As a variation you can construct the object at call time instead:
function a(){ var x = 5, obj = {}; b({x : x, obj: obj}); } function b(v){ // access v.x or v.obj... // or set new local x and obj variables to these and use them. } a();