当前位置: 首页 > 面试题库 >

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

廉学潞
2023-03-14
问题内容

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

例如,

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

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

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


问题答案:

真正访问函数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();


 类似资料:
  • 问题内容: 我尝试了以下失败的尝试: 在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数? 问题答案: 用于对in函数具有相同的访问权,如下所示:

  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 问题内容: 与Firebase问题相比,这更像是JavaScript关闭问题。在以下代码中,Firebase回调无法识别父作用域中的变量myArr。 问题答案: 回调函数可以很好地识别/修改。问题是,当执行标记为“不工作”的标签时,回调尚未触发。 让我们稍微更改一下代码: 现在,可能会更容易了解发生了什么。 您注册一个侦听器,该侦听器将调用添加到Firebase中的每个帖子 这将导致对服务器的调用

  • 问题内容: 我不理解以下示例,可以说我具有以下功能: 为什么#1是正确的解决方案,而#2是错误的解决方案?基本上是一个字典,所以如果我想将参数传递给openX,我认为正确的方法是没有并给出字典。但是python显然不喜欢第二个,并告诉我我给了3个而不是2个参数。那么,这背后的原因是什么? 问题答案: 在第二个示例中,您提供3个参数:文件名,模式和字典()。但是Python期望:2个形式参数和关键字

  • 问题内容: 将“当前”传递给AngularJS服务是否正确? 我处于一种$ service的状态,知道它仅由一个控制器使用,并且我想在$ service方法本身中引用该控制器的作用域。 这在 哲学上是 正确的吗? 还是最好将事件广播到$ rootScope,然后让我的控制器侦听它们? 问题答案: 要让控制器知道何时发生异步,请使用Angular promises。 要触发,您不需要作用域,可以调用

  • 问题内容: 我想将一个类变量传递给另一个类,并使其成为该类的类变量。在以下情况下我该怎么做? 问题答案: 很难理解您正在问的问题,但这是一个可能的答案: 使B类成为A的子类: 如果重新声明为,则会出现一种情况,其中存在一个可以称为或的属性。(或在任一或刚刚…甚至作为或地方,并有类型和分别。) 如果您无法在和(或,以及一些包含声明的第三类)之间创建直接或子类型关系,那么您很不走运。他们无法共享声明。