一尘不染

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

node.js

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

例如,

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

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

我宁愿直接访问变量,即,不使用类似this.a或的任何东西this.obj,而只是直接使用xobj


阅读 203

收藏
2020-07-07

共1个答案

一尘不染

真正访问函数a私有范围的唯一方法是在函数b内部声明,a这样就形成了一个闭包,允许隐式访问a变量。

这是您的一些选择。

直接访问

  1. b在内部声明a
        function a() {
       var x = 5,
          obj = {};
       function b(){
          // access x or obj...
       }
       b();
    }

    a();
  1. 如果您不想b在中使用a,则可以将它们都放在更大的容器范围内:
        function container() {
       var x, obj;
       function a(){
          x = 5;
          obj = {..};
          b();
       }
       function b(){
          // access x or obj...
       }
    }

    container.a();

这些是您可以a直接使用的变量b而无需任何额外的代码来移动内容的唯一方法。如果您对一点“帮助”和/或间接的内容感到满意,这里有一些更多的想法。

间接访问

  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};
  1. 您可以b使用可访问a的私有变量的getter和setter 传递对象:
        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

  1. 您可以将变量放在一个对象中并传递该对象:
        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();
2020-07-07