JavaScript 将作用域传递给另一个函数

标签 javascript node.js closures scope serverside-javascript

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

例如,

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

function b(){
   //access x or obj....
}

我宁愿直接访问变量,即不使用 this.athis.obj 之类的任何东西,而只使用 xobj 直接。

最佳答案

真正访问函数 a 的私有(private)作用域的唯一方法是在 a 内声明 b 以便它形成一个闭包允许隐式访问 a 的变量。

这里有一些选项供您选择。

直接访问

  1. a 内声明 b

    function a() {
       var x = 5,
          obj = {};
       function b(){
          // access x or obj...
       }
       b();
    }
    
    a();
    
  2. 如果您不希望 ba 内,那么您可以将它们都放在更大的容器范围内:

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

这些是您可以直接在 b 中使用 a 的变量的唯一方法,而无需额外的代码来移动。如果您满足于一点“帮助”和/或间接性,这里还有一些想法。

间接访问

  1. 您可以只将变量作为参数传递,但除了对对象的属性之外没有写访问权限:

    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};
    
  2. 您可以传递 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)的,分配给 athis 对象,但这样它们只有在 a 中明确给出时才能访问.

  3. 你可以把你的变量放在一个对象中并传递这个对象:

    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/

相关文章:

javascript - 为什么 `arr.find()` 返回 `undefined` ?

java - 如何将闭包从 groovy 导入到 java?

javascript - 如何将下拉选项值附加为数组

javascript - 在 AngularJS 应用程序加载时收到通知

javascript - 如何在删除ajax中使用成功回调[NODE.JS]

javascript - Event.target.id 返回空字符串?

javascript - 在快速服务器中生成子进程

javascript - 使用 Sequelize 和 NodeJS 与主键中的其他键进行查询

swift - 方法闭包是否在 swift 中保留实例?