2011-08-29 6 views
5

最近、私の仕事のほとんどはjsの開発に関連しています。作成する内部関数のコピー数

しかし、突然私はいくつかの質問と混同していることがわかりました。

チェックこのコード(私はカスタムクラスに1つのメソッドを追加します):今すぐ

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、machine code、threaded code、...)に変換することができるので、関数の実際の「インスタンス化」は本当に安いです。

多くの機能言語は、同様の特性を持っています。 (let ...)または何かで宣言されたローカルのScheme関数は、それを含む関数が呼び出されるたびに同様に呼び出されます。

+0

これはメモリの浪費ですか?それらを変更するための任意のアイデア?しかし、私はそれらを公開したくないので、私はそれらを外に定義したくありません。 – hguser

+1

これは本当に記憶の浪費ではありません。それらはインスタンス化されますが、メソッド 'fun'が実行された後に投げ捨てられます。 JavaScriptのガベージコレクタはすぐ後に来て、それらを収集し、それらを投げる。 – Stephen

+1

Erlangの著名人であるJoe Armstrongは、開発者にできるだけ「最も美しいコードを書く」ように促し、その言語の問題に対するこうした心配に応えています。 *アルゴリズム的に*健全なコードを作成し、極端な(起こりそうにない)場合にのみそのようなことを心配してください。 – Pointy

0

JavaScriptの機能は、機能オブジェクトです。関数本体では、関数が呼び出されるたびにインスタンス変数がインスタンス化されています。この2つを考えると、答えは明らかです。つまり、外部関数が呼び出されるたびに内部関数が作成されます。

関連する問題