JavaScript pass scope to another function

后端 未结 10 578
被撕碎了的回忆
被撕碎了的回忆 2020-12-23 16:48

Is it possible to somehow pass the scope of a function to another?

For example,

function a(){
   var x = 5;
   var obj = {..};
   b()         


        
相关标签:
10条回答
  • 2020-12-23 17:13

    I think the simplest thing you can do is pass variables from one scope to a function outside that scope. If you pass by reference (like Objects), b has 'access' to it (see obj.someprop in the following):

    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
    }
    
    0 讨论(0)
  • 2020-12-23 17:18

    The only way to truly get access to function a's private scope is to declare b inside of a so it forms a closure that allows implicit access to a's variables.

    Here are some options for you.

    Direct Access

    1. Declare b inside of a.

      function a() {
         var x = 5,
            obj = {};
         function b(){
            // access x or obj...
         }
         b();
      }
      
      a();
      
    2. If you don't want b inside of a, then you could have them both inside a larger container scope:

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

    These are the only ways you're going to be able to use a's variables directly in b without some extra code to move things around. If you are content with a little bit of "help" and/or indirection, here are a few more ideas.

    Indirect Access

    1. You can just pass the variables as parameters, but won't have write access except to properties of objects:

      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();
      

      As a variation on this you could get write access by passing updated values back to a like so:

      // in a:
      var ret = b(x, obj);
      x = ret.x;
      obj = ret.obj;
      
      // in b:
      return {x : x, obj : obj};
      
    2. You could pass b an object with getters and setters that can access a's private 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();
      

      The getters and setters could be public, assigned to the this object of a, but this way they are only accessible if explicitly given out from within a.

    3. And you could put your variables in an object and pass the object around:

      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();
      

      As a variation you can construct the object at call time instead:

      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();
      
    0 讨论(0)
  • 2020-12-23 17:18

    As others have said, you cannot pass scope like that. You can however scope variables properly using self executing anonymous functions (or immediately executing if you're pedantic):

    (function(){
        var x = 5;
        var obj = {x:x};
        module.a = function(){
            module.b();
        };
        module.b = function(){
            alert(obj.x);    
        };
    }());
    
    a();
    
    0 讨论(0)
  • 2020-12-23 17:23

    You can't "pass the scope"... not that I know of.
    You can pass the object that the function is referring to by using apply or call and send the current object (this) as the first parameter instead of just calling the function:

    function b(){
        alert(this.x);
    }
    function a(){
        this.x = 2;
        b.call(this);
    }
    

    The only way for a function to access a certain scope is to be declared in that scope.
    Kind'a tricky.
    That would lead to something like :

    function a(){
        var x = 1;
        function b(){
            alert(x);
        }
    }
    

    But that would kind of defeat the purpose.

    0 讨论(0)
  • 2020-12-23 17:24

    what about using bind

    function funcA(param) {     
        var bscoped = funcB.bind(this);     
        bscoped(param1,param2...)
    }
    
    0 讨论(0)
  • 2020-12-23 17:26
    function a(){
       var x = 5;
       var obj = {..};
       var b = function()
       {
            document.println(x);
       }
       b.call();
    }
    
    0 讨论(0)
提交回复
热议问题