是否可以通过某种方式将一个函数的范围传递给另一个函数?
例如,
function a(){ var x = 5; var obj = {..}; b(<my-scope>); } function b(){ //access x or obj.... }
我宁愿直接访问变量,即,不使用类似this.a或的任何东西this.obj,而只是直接使用x或obj。
this.a
this.obj
x
obj
真正访问函数a私有范围的唯一方法是在函数b内部声明,a这样就形成了一个闭包,允许隐式访问a变量。
a
b
这是您的一些选择。
直接访问
function a() { var x = 5, obj = {}; function b(){ // access x or obj... } b(); } a();
function container() { var x, obj; function a(){ x = 5; obj = {..}; b(); } function b(){ // access x or obj... } } container.a();
这些是您可以a直接使用的变量b而无需任何额外的代码来移动内容的唯一方法。如果您对一点“帮助”和/或间接的内容感到满意,这里有一些更多的想法。
间接访问
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();
作为此方法的一种变体,您可以通过将更新后的值传递回来获得写访问权,a如下所示:
// in a: var ret = b(x, obj); x = ret.x; obj = ret.obj; // in b: return {x : x, obj : obj};
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();
获取器和设置器可以是公共的,分配给的this对象a,但是只有从内部明确给出时,它们才可以访问a。
this
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();
作为一种变体,您可以在调用时构造对象:
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();