2015-09-07 73 views
0

這是一個關於Javascript和Node的常見問題。假設我有一個是這樣一個功能:Javascript函數聲明和關閉

function outer(a,b){ 
    function inner(){ 
     console.log(a[b]); 
    } 
    inner(); 
} 

外部函數將被多次使用,它有這樣的觀點,因爲我不想使用全局變量。 每次我調用外部函數時,都會聲明內部函數嗎? 如果每次都聲明它,有沒有辦法讓代碼更高性能而不使用全局變量?

+0

你沒有回到內在的功能嗎?爲什麼不直接調用'console.log'? – MinusFour

+0

你正在尋找執行內部函數,還是你關心返回/保存爲異步調用? – Amit

+0

我想從內部函數返回值.'a'和'b'最初是全局變量,但現在我意識到有時需要更改值才能使'內部'正常工作。 - 不希望'a'和'b'全局改變,所以我將它封裝在一個外部函數中。現在我擔心表演。 – user3806501

回答

0

如果不使用靜態(在JS情況下爲全局變量)變量,函數將在每次都被聲明。這裏的方法是使封裝了功能的對象:我希望我明白你的問題,代碼是太微不足道承擔更多的你想要什麼

var AnObject = function(a,b) { 
    this.a = a; 
    this.b = b; 
    this.foo = function() { 
     return this.a[this.b]; 
    }; 
}; 

function outer(a,b) { 
    var inner = new AnObject(a,b); 
    console.log(inner.foo()); 
} 

+0

謝謝!這是我正在尋找的。 – user3806501

+0

地獄不??現在你不僅創建一個函數,而且每次調用'outer'時都會創建一個對象*和*函數。 – Bergi

+0

我剛剛用鉻引擎進行了內存檢查,調用外部10000次。當內部函數被定義在外部函數內部時,它假定你需要一個內聯函數(內聯像C++一樣)。如果你在調用之外定義了對象,那麼你正在使用引用,編譯器的工作量比所討論的代碼要小。 – Alex

0

功能inner時便會在每次調用outer 時間宣佈我認爲你可以只寫

function outer(a,b){ 
    console.log(a[b]); 
} 

而且沒有全局變量。

+0

你必須假設代碼'控制檯。log'不在那裏,而是一個更復雜的代碼。 – Alex

0

將內部函數聲明我每次調用外部函數的時間?

是。但是,這並不是那麼低效,並且通過引擎進行了很好的優化。

如果每次都聲明,有沒有辦法讓代碼更高性能,而不使用全局變量?

比它需要的是不要讓你的代碼變得更加複雜。如果它能夠正常工作並且可以維護,請保持原樣。 outer可能會經常被調用很多次,但除非它是一個非常熱的路徑,並且您通過基準測試確定這是一個性能瓶頸,則無需採取措施。不成熟的優化是萬惡之源。

但是,回到你的問題:是的,有辦法避免功能的娛樂,而無需使用全局變量。只是傳遞inner需求作爲參數傳遞給每一個電話的值:

function inner(a,b){ 
    console.log(a[b]); 
} 
function outer(a,b){ 
    inner(a,b); 
} 

假設內部函數不分配到封閉變量這個效果很好。

如果要避免將inner置於全局範圍內,只需使用module pattern即可創建outer