JavaScript将范围传递给另一个函数

是否有可能以某种方式将函数的范围传递给另一个?

例如,

function a(){ var x = 5; var obj = {..}; b(<my-scope>); } function b(){ //access x or obj.... } 

我宁愿直接访问variables,即不使用任何像this.objthis.obj ,但只是直接使用xobj

真正获得函数的私有作用域的唯一方法是在b中声明b ,所以它形成一个闭包,允许隐式访问variables。

这里有一些你的select。

直接访问

  1. a声明b

     function a() { var x = 5, obj = {}; function b(){ // access x or obj... } b(); } a(); 
  2. 如果你不想要b里面的a ,那么你可以把它们放在一个更大的容器范围内:

     function container() { var x, obj; function a(){ x = 5; obj = {..}; b(); } function b(){ // access x or obj... } } container.a(); 

这些是你将能够直接在b使用variables的唯一方法,而无需额外的代码来移动。 如果你满足于一点“帮助”和/或间接,这里有一些更多的想法。

间接访问

  1. 您可以只传递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}; 
  2. 你可以传递一个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被发现的时候才能被访问。

  3. 你可以把你的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 } 

你不能“超越范围”…不是我所知道的。
您可以使用applycall来传递函数所引用的对象,而不是仅仅调用该函数,而是将当前对象( 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 } }