是否有可能以某种方式将函数的作用域传递给另一个函数?
例如,
function a(){
var x = 5;
var obj = {..};
b(<my-scope>);
}
function b(){
//access x or obj....
}
我宁愿直接访问变量,即不使用 this.a
或 this.obj
之类的任何东西,而只使用 x
或 obj
直接。
最佳答案
真正访问函数 a
的私有(private)作用域的唯一方法是在 a
内声明 b
以便它形成一个闭包允许隐式访问 a
的变量。
这里有一些选项供您选择。
直接访问
在
a
内声明b
。function a() { var x = 5, obj = {}; function b(){ // access x or obj... } b(); } a();
如果您不希望
b
在a
内,那么您可以将它们都放在更大的容器范围内:function container() { var x, obj; function a(){ x = 5; obj = {..}; b(); } function b(){ // access x or obj... } } container.a();
这些是您可以直接在 b
中使用 a
的变量的唯一方法,而无需额外的代码来移动。如果您满足于一点“帮助”和/或间接性,这里还有一些想法。
间接访问
您可以只将变量作为参数传递,但除了对对象的属性之外没有写访问权限:
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};
您可以传递
b
一个带有 getter 和 setter 的对象,这些 getter 和 setter 可以访问a
的私有(private)变量: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();
getter 和 setter 可以是公共(public)的,分配给
a
的this
对象,但这样它们只有在a 中明确给出时才能访问
.你可以把你的变量放在一个对象中并传递这个对象:
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();
关于JavaScript 将作用域传递给另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6348852/