2015-08-28 92 views
1

如果執行下面的代碼,G是在什麼地方定義的?命名函數定義如何在Javascript的非全局範圍內工作?

function F() { function G() {} } f = new F();

我得到F是現在可作爲Fwindow.F(假設瀏覽器上下文),但我不知道是否有可能有一個非全球範圍內一個名爲函數的定義(如F的範圍通過new調用)。

可替換地,我可以抓住它的一個引用,經由

function F() { function G() {} window.theG = G; } f = new F();

然後console.log(window.theG)返回function G()(在Chrome DevTools)。所以G 存在,我們有一個參考,但有沒有其他方式可以訪問G?

+0

你的目標是什麼?你想做什麼,你需要這個? – biancamihai

+0

@biancamihai我根本不需要這樣做 - 我們剛剛進入了一段長時間的Javascript討論,最終在這裏結束! :p – zachberry

回答

4

函數聲明在當前範圍中創建一個匹配函數名稱的變量。

當調用F時,會創建一個名爲G的本地變量。除非你在某個地方複製它的值(例如用window.theG,儘管this.theG將是一個更常見的模式),該函數將會完成執行,不會有任何引用留給它,它將被垃圾收集。

即它的行爲就像其他具有值的局部變量一樣。在這方面沒有什麼特別的功能。

+1

啊,好的,所以函數G()'等同於'var G = function G()'?在這種情況下,非常明顯的是,它創建了一個垃圾收集的局部變量。 – zachberry

+0

有一些細微的差異,但就範圍而言,是的。 – Quentin

2

在你提供的第一個例子中,G是一個F的私有變量。因爲它只存在於F的上下文中,所以一旦執行F,G就被處置。如果您想保留對它的引用,你可以把它分配給了全球範圍內,你在將其設置爲像這樣的F屬性的第二個例子一樣:

function F() { 
    this.G = function() {} 
} 

,現在你可以訪問它像這樣:

var f = new F(); 
f.G(); 
相關問題