2011-08-29 66 views
5

現在我的大部分工作都與js開發有關。將創建多少個內部函數副本

但是我突然發現我對一些問題感到困惑。

檢查這個代碼(我添加一個方法到自定義類):

MyCustomClass.prototype.fun=function(xx){ 
    this.options={.....} 
    function innerFun01(){} 
    function innerFun02(){} 
} 

現在,使用它。

var mcc=new MyCustomClass(); 
mcc.fun(xxxx); 

var mcc2=new MyCustomClass(); 
mcc2.fun(xxxx); 

現在,我想知道在內存中會創建多少個函數「innerFun01」和「innerFun02」的副本?

我真的很困惑。

回答

5

每次調用函數「fun」時都會構造這些函數。 (我認爲這些函數的新實例將被構造更加正確

沒關係。現代JavaScript運行時系統非常好。有可能將源代碼翻譯成...以及任何(thunks,機器代碼,線程代碼,...)在外部函數首次被解析時完成,以便實際的函數實例化低廉。

很多功能語言都有類似的特徵。每次調用其包含函數時,同樣會使用聲明爲(let ...)或其他東西的本地Scheme函數。

+0

這是浪費內存嗎?任何想法改變他們?但我不想在外面定義它們,因爲我不想公開它們。 – hguser

+1

這不是真的浪費內存。他們得到實例化,但在方法「樂趣」完成運行後拋出。 JavaScript垃圾回收器很快就會出現並收集起來並拋出。 – Stephen

+1

Erlang的傑出人物Joe Armstrong通過敦促開發人員「儘可能寫出最美的代碼」來回應關於該語言問題的擔憂。編寫*算法*聲音的代碼,只在極端(不太可能)的情況下擔心這種情況。 – Pointy

0

一個簡單的規則有助於澄清你的困惑:JavaScript函數是函數對象。我們都知道,在函數體中,局部變量在每次函數被調用時都被實例化。鑑於這兩者,答案顯而易見:每次調用外部函數時都會創建內部函數。