2014-11-13 57 views
0

考慮代碼:如何從Javascript中的外部範圍調用函數?

function foo() 
{ 
    console.log('foo'); 
} 

function bar() 
{ 
    var foo = 5; 
    foo(); // (*) 
} 

如何使(*)指外部函數,而不是局部變量?

+0

在理想情況下,你乾脆把每個將這些模塊放入一個模塊中,並根據需要「需要」這些模塊以避免所有範圍模糊。 – ssube

+0

@ssube,不是在我的情況下,它是少量的代碼,但名稱是好的(說明性的),這就是爲什麼我使用了兩次。當然,我可以用下劃線,但由於示波器不同,它對我來說很難看。 – greenoldman

+0

不確定下劃線在哪裏;我的意思是,如果你有兩個不同的對象(或類型,或你有什麼)具有相同的名稱,這可能表明你應該將你的代碼分割成模塊(或名稱空間)。在'var otherFoo = {foo:function ...'中包裝函數foo()'可以解決你的問題,這是模塊的功能。 – ssube

回答

1

如果外部範圍是全球範圍內,你可以做

window.foo(); // assuming you're in a browser 

如果沒有,那麼你的運氣了。給本地變量另一個名字。

當你運氣不好的例子:

window.onload = function() { 
    function foo() 
    { 
     console.log('foo'); 
    } 

    function bar() 
    { 
     var foo = 5; 
     foo(); // (*) 
    } 
} 

匿名「裝載」處理函數的範圍還沒有名字,或其他任何手柄,通過該代碼函數「bar」的可能表示它想要參考「foo」而不是本地的。

請注意,Coffeescript明確不允許這樣;它不會允許本地符號隱藏更全球的符號。 (這是一個controversial feature of the language,你跳上CoffeeScript的車前。)

+0

謝謝你的教育回答! – greenoldman