【问题标题】:How do you call a local function?如何调用本地函数?
【发布时间】:2011-08-03 02:28:20
【问题描述】:

这里是基本的大纲

function x(){
   // some code 
   function y(){
   //some more code
  }
}

function z(){
  // how do i call function y?
}

我试过了

function z(){
   window[x][y];
} 

and

function z(){
x();y();
}

都不行!

【问题讨论】:

    标签: javascript function scope


    【解决方案1】:

    代码很多,解释不多。

    function x(){
       // some code 
       function y(){
       //some more code
      }
    }
    

    上面在x里面声明了y,所以每次x都会被创建为x的变量对象的一个​​属性 被调用。 y 只能从 x 内部访问,除非 x 内部的代码使其可以从其他地方访问。

    function z(){
      // how do i call function y?
    }
    

    要从 z 内部调用 y,它必须在 z 的作用域链上可用。这可以通过在函数调用中传递它(使其成为 z 的变量对象的属性)或使其成为 z 范围内某个对象的属性来完成链。

    如果该函数对两个函数都可用,那么在 xz 都可以访问它的地方声明它是有意义的,或者初始化 zy 可用的方式。例如

    var z;
    var x = (function() {
      function y(){}
    
      z = function() {
            // something that calls y;
          };
    
      return function() {
        // x function body
      }
    }());
    

    在上面,xz 都可以访问相同的 y 函数,并且不是每次都创建 x 被调用。请注意,在分配给 x 的代码执行之前,z 将是未定义的。

    还请注意,y xz 可用,它不能被任何其他函数(因此 y 可能被称为 private 函数,而 xz 可能被称为 特权函数)。

    【讨论】:

      【解决方案2】:

      1:

      var ref;
      function x(){
         // some code 
         function y(){
         //some more code
        }
        ref = y;
      }
      x();
      
      function z(){
        ref();
      }
      

      2:

      function x() {
      };
      
      x.y = function() { alert('2');};
      
      function z() {  x.y(); }
      

      3:

      function y(){ alert('god'); };
      function x() {
          function a() {
              y();
          }
      }
      function z() {
            y();
      }
      z();
      

      【讨论】:

      • 但这会在全局命名空间中添加ref
      • 啊,全球命名空间团队的到来只是时间问题。我给出了一个原始的例子,实际上他应该在代码周围使用一个自执行的匿名函数,等等。
      【解决方案3】:
      function x(){
         // some code 
        this.y=function(){
         //some more code
        }
      }
      
      function z(){
       var fun_x=new x();
      fun_x.y();
      }
      

      全局命名空间仍然是这段代码之前的样子

      【讨论】:

      • 除了如果 x 不作为构造函数调用(并且代码不是在严格模式下),将添加一个 y 属性到全局/窗口对象。
      • @RobG 但是在代码中,x 被称为构造函数,属性y 将被添加到调用x 时上下文设置的任何对象中
      • 上下文?执行上下文无关紧要。顺便说一句,在分配之后:var fun_x = new x(); 应该是 'fun_x.y();`。
      猜你喜欢
      • 2019-04-10
      • 1970-01-01
      • 2013-06-05
      • 2018-08-21
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多