2013-12-18 25 views
0

比方說,我有以下的JavaScript使用Javascript - 調用一個本地函數/屬性雖然在全球範圍

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

有反正我可以在全球範圍內調用firstInnerFunction()?如果是這樣(還有更好的辦法),我可以下兩層並從全局範圍調用innerInnerFunction()嗎?

+0

Nop,你不能。 – elclanrs

回答

0

總之,沒有。 JavaScript是功能範圍的,因此內部的所有內容都是從外部隱藏的。所以爲了訪問內部函數,你需要以某種方式公開它們。

絕對簡單(但醜陋的)選擇是做這樣的事情:

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... 
0

如果你想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" 
2

你在做這樣的事情時想達到什麼目的?我建議像下面這樣:

var myGlobalFunction = { 
    var innerInnerFunction() { return "clouds"; } 
    get firstInnerFunction() { return "rainbows"; } 
    get secondInnerFunction() { return innerInnerFunction(); } 
}; 

然後,您可以像這樣調用firstInnerFunction():

myGlobalFunction.firstInnerFunction; 

爲在全局範圍內調用innerInnerFunction(),myGlobalFunction.secondInnerFunction()將起到與直接調用innerInnerFunction()相同的作用。

0

我不認爲這是可能的,但我可能是錯的。你可以這樣做,通過頂層函數訪問嵌套函數。

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函數和嵌套函數一些有用的信息。 Javascript Function Scope

0

我相信像這樣的東西也可以,但我喜歡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();