2017-03-07 6 views
1

、私はこの2つのコードがあります。クロージャ内でプロトタイプを作成する方法は?ここで

var mod = function() { 
    var a = function() { 
     this.fucname = 'hello'; 
    }; 

    a.prototype.build = function() { 
     return 'before '+this.fucname; 
    }; 

    return new a(); 
}; 

for(var i=0; i<10000; i++){ 
    var newfuc = mod(); 
}; 

var a = function() { 
    this.fucname = 'hello'; 
}; 

a.prototype.build = function() { 
    return 'before '+this.fucname; 
}; 

for(var i=0; i<10000; i++){ 
    var newfuc = new a(); 
}; 

を私はクロームdev内の両方をチェックした後、第二のコードはJSヒープ3.0メガバイトを取る、 最初のコードJSを取りますHEAP 10MB。

つまり、ビルド機能は最初のコードで10000回作成されましたか?カバーを外さずにどのように修正することができますかmod?私は関数に何かを渡す必要があり

...

+0

'build'と' a'の両方の関数です。あなたが対処しなければならない現実的な状況の「モジュール」を10,000倍呼びますか? – Ryan

+0

はい、また、いくつかの変数を内側に置いて、 "mod"のカバーを外さずに渡す必要があることに注意してください。 – user3769916

+0

したがって、 'mod'関数を持つようにコードを変更してください正当化された。 – zerkms

答えて

2

あなたはコンストラクタを非表示にするだけでなく、一度だけ、それを評価する場合は、新しいスコープを作成するIIFEを利用することができます:

var mod = (function() { 
    var a = function() { 
    this.fucname = 'hello'; 
    }; 

    a.prototype.build = function() { 
    return 'before ' + this.fucname; 
    }; 

    return function() { 
    return new a(); 
    }; 
})(); 

for (var i = 0; i < 10000; i++) { 
    var newfuc = mod(); 
} 
+0

ありがとう、両方の戻り値は私にも変数を渡す能力を与えます。 – user3769916

関連する問題