JavaScript将范围传递给另一个函数
是否有可能以某种方式将函数的范围传递给另一个?
例如,
function a(){ var x = 5; var obj = {..}; b(<my-scope>); } function b(){ //access x or obj.... }
我宁愿直接访问variables,即不使用任何像this.obj
或this.obj
,但只是直接使用x
或obj
。
真正获得函数的私有作用域的唯一方法是在b
中声明b
,所以它形成一个闭包,允许隐式访问variables。
这里有一些你的select。
直接访问
-
在
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
使用variables的唯一方法,而无需额外的代码来移动。 如果你满足于一点“帮助”和/或间接,这里有一些更多的想法。
间接访问
-
您可以只传递variables作为参数,但除了对象的属性外,将不具有写权限:
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();
作为一个变种,你可以通过传递更新的值来获得写访问权限,如下所示:
// in a: var ret = b(x, obj); x = ret.x; obj = ret.obj; // in b: return {x : x, obj : obj};
-
你可以传递一个getter和setter对象来访问
a
私有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();
getter和setter可以是公开的,被分配给a的
this
对象,但是这样它们只有在明确地从a
被发现的时候才能被访问。 -
你可以把你的variables放在一个对象中,然后传递对象:
function a(){ var v = { x : 5, obj : {} }; b(v); } function b(v){ // access vx or v.obj... // or set new local x and obj variables to these and use them. } a();
作为一种变体,您可以在通话时构build对象:
function a(){ var x = 5, obj = {}; b({x : x, obj: obj}); } function b(v){ // access vx or v.obj... // or set new local x and obj variables to these and use them. } a();
范围是由函数创build的,范围保留一个函数,所以最接近你要求的是将一个函数从a()
传递给b()
,并且该函数将继续访问a()
范围variables。
function a(){ var x = 5; var obj = {..}; b(function() { /* this can access var x and var obj */ }); } function b( fn ){ fn(); // the function passed still has access to the variables from a() }
虽然b()
不能直接访问函数传递的variables,但是如果传递的函数返回该对象,则可以访问传递引用的数据types(如Object)。
function a(){ var x = 5; var obj = {..}; b(function() { x++; return obj; }); } function b( fn ){ var obj = fn(); obj.some_prop = 'some value'; // This new property will be updated in the // same obj referenced in a() }
没有。
您正在访问本地作用域对象。 [[Context]]
。
你不能公开访问它。
现在,因为它是node.js,你应该可以编写一个C ++插件,让你可以访问[[Context]]
对象。 我强烈build议不要这样做,因为它带来了JavaScript语言的专有扩展。
怎么样使用bind
function funcA(param) { var bscoped = funcB.bind(this); bscoped(param1,param2...) }
正如其他人所说,你不能通过这样的范围。 但是,您可以使用自行执行的匿名函数正确地确定variables的范围(或者如果您是迂腐的,则立即执行):
(function(){ var x = 5; var obj = {x:x}; module.a = function(){ module.b(); }; module.b = function(){ alert(obj.x); }; }()); a();
我认为你可以做的最简单的事情就是将variables从一个范围传递到这个范围之外的一个函数。 如果你通过引用传递(如对象),b 有 '访问'(请参阅下面的obj.someprop):
function a(){ var x = 5; var obj = {someprop : 1}; b(x, obj); alert(x); => 5 alert(obj.someprop); //=> 'otherval' } function b(aa,obj){ x += 1; //won't affect x in function a, because x is passed by value obj.someprop = 'otherval'; //change obj in function a, is passed by reference }
你不能“超越范围”…不是我所知道的。
您可以使用apply
或call
来传递函数所引用的对象,而不是仅仅调用该函数,而是将当前对象( this
)作为第一个参数发送:
function b(){ alert(this.x); } function a(){ this.x = 2; b.call(this); }
函数访问特定范围的唯一方法是在该范围内声明。
很棘手。
那会导致类似于:
function a(){ var x = 1; function b(){ alert(x); } }
但是那样会打破目的。
function a(){ var x = 5; var obj = {..}; var b = function() { document.println(x); } b.call(); }
你可以创build你的variables没有var
关键字,他们将是全球性的,但没有办法通过我知道的范围…
function a(){ this.x = 5; this.obj = {..}; var self = this; b(self); } function b(scope){ //access x or obj.... }
你有没有尝试过这样的事情:
function a(){ var x = 5; var obj = {..}; b(this); } function b(fnA){ //access x or obj.... fnA.obj = 6; }
如果你可以把functionB作为一个方法functionA,那么这样做:
function a(){ var x = 5; var obj = {..}; b(this); this.b = function (){ // "this" keyword is still === function a } }