2011-08-29 63 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函数是函数对象。我们都知道,在函数体中,局部变量在每次函数被调用时都被实例化。鉴于这两者,答案显而易见:每次调用外部函数时都会创建内部函数。