Javascript-在全局范围内调用本地函数/属性

Javascript-在全局范围内调用本地函数/属性,javascript,Javascript,假设我有以下JavaScript function myGlobalFunction(){ function firstInnerFunction(){ return "rainbows"; } function secondInnerFunction(){ function innerInnerFunction(){ return "clouds"; } return

假设我有以下JavaScript

function myGlobalFunction(){
    function firstInnerFunction(){
         return "rainbows";
    }
    function secondInnerFunction(){
         function innerInnerFunction(){
               return "clouds";
         }
         return innerInnerFunction();
    }
    return firstInnerFunction(); //valid call
}

在全局作用域中是否有我可以调用firstInnerFunction()的方法?如果是这样的话(更好的是),我是否可以向下两层从全局范围调用innerFunction()?

如果您希望调用globalFunction来定义firstInnerFunction,可以按如下操作

function globalFunction() {
    firstInnerFunction = function() { return "rainbows" ; } ;
}
对于innerInner函数,可以执行以下操作

function globalFunction() {
    firstInnerFunction = function() { return "rainbows" ; } ;
    secondInnerFunction = function() {
        innerInnerFunction = function() { return "clouds" ; } ; }
}
现在你可以这样做了

globalFunction() ; // defines firstInnerFunction and secondInnerFunction in the global scope
firstInnerFunction() ; // returns "rainbows"
secondInnerFunction() ; // defines innerInnerFunction
innerInnerFunction() ; // returns "clouds"

你做那样的事想要达到什么目的?我建议如下:

var myGlobalFunction = { 
    var innerInnerFunction() { return "clouds"; }
    get firstInnerFunction() { return "rainbows"; }
    get secondInnerFunction() { return innerInnerFunction(); }
};
然后,您可以使用如下方法调用firstInnerFunction():

myGlobalFunction.firstInnerFunction;
var secondInnerCopy;

function myGlobalFunction(){
    function firstInnerFunction(){
         return "rainbows";
    }
    function secondInnerFunction(){
         function innerInnerFunction(){
               return "clouds";
         }
         return innerInnerFunction();
    }
    secondInnerCopy = secondInnerFunction;
    return firstInnerFunction(); //valid call
}

myGlobalFunction();
secondInnerCopy(); //valid (only after myGlobalFunction called though)

至于从全局作用域调用InnerFunction(),myGlobalFunction.secondInnerFunction()的作用与直接调用InnerFunction()的作用相同。

简而言之,不。JavaScript是函数作用域,因此内部的所有内容都从外部隐藏。因此,为了访问内部函数,您需要以某种方式公开它们

绝对最简单(但丑陋)的选择是这样做:

myGlobalFunction.firstInnerFunction;
var secondInnerCopy;

function myGlobalFunction(){
    function firstInnerFunction(){
         return "rainbows";
    }
    function secondInnerFunction(){
         function innerInnerFunction(){
               return "clouds";
         }
         return innerInnerFunction();
    }
    secondInnerCopy = secondInnerFunction;
    return firstInnerFunction(); //valid call
}

myGlobalFunction();
secondInnerCopy(); //valid (only after myGlobalFunction called though)
更好的选择是重构为具有以下函数的对象图:

var global = {
    myGlobalFunction: function(){
        return this.inner.firstInnerFunction(); //valid call
    },
    inner: {
        firstInnerFunction: function() {
            return "rainbows";
        },
        secondInnerFunction: function(){
            return this.inner.innerInnerFunction();
        },
        inner: {
            innerInnerFunction: function(){
               return "clouds";
            }
        }
    }
};

global.myGlobalFunction();
global.inner.inner.innerInnerFunction();
//etc...

我不认为这是可能的,但我可能是错的。您可以这样做,通过顶级函数访问嵌套函数

function A(x) {
   function B(y) {
      function C(z) {
         alert(x + y + z);
      }
      C(3);
   }
   B(2);
}
A(1); // alerts 6 (1 + 2 + 3)
另一个例子

function addSquares(a,b) {
   function square(x) {
      return x * x;
   }
   return square(a) + square(b);
}
a = addSquares(2,3); // returns 13
b = addSquares(3,4); // returns 25
c = addSquares(4,5); // returns 41

检查这个链接,它有一些关于Javascript中函数和嵌套函数的好信息

尽管我喜欢Alconja的做法,但我相信这样的做法也会奏效

var myGlobalFunction = {
  firstInnerFunction: function(){
     return "rainbows";
  },
  secondInnerFunction : function(){
     var innerInnerFunction =  function(){
         return "clouds";
     }
     var inninnerFuncTwo = function(){
         return 'more stuff';
     }
     return {
      inn : innerInnerFunction,
      inn2: inninnerFuncTwo
      }
  }
}

myGlobalFunction.secondInnerFunction().inn();
myGlobalFunction.secondInnerFunction().inn2();