2017-07-09 7 views
1

私は、関数コンストラクタを使用して関数を生成するライブラリに取り組んでいます。アクセスを含むアクセス

生成される各関数は、optionsパラメータのデフォルト値を格納するために、defaultという関数にアタッチされたプロパティを持ちます。

var generated_function = function(arg1, arg2, options_arg){ ... } 
generated_function.default = {} 

代わりに、このような関数の中にそれを保存する機能のプロパティとしてデフォルトを取り付けるための理由:そうのような

var generated_function = function(arg1, arg2, options_arg){ 
    default = {} 
} 

私はオプションがしたいということです必要に応じて実行時にデフォルト設定を変更します。

デフォルトのオプションは100sまたは1000sのプロパティで構成された大きなオブジェクトであり、引数のオプションはデフォルトでは平均25%のサイズにすぎません。

この関数を100秒または1000秒間呼び出すとします。呼び出しごとに引数のオプションを変更していますが、既定のオプションを変更するだけで、最大で2倍になります。

これでデフォルトオプションとその引数の引数オプションを渡すことができましたが、生成される関数のサイズが非常に大きいオブジェクトをたくさん作成して渡す必要がありました。これは記憶上の問題です。

私はこのスクリプトでメモリの問題を抱えていません。関数が生成されていることを覚えておいてください。そのサイズと頻度のデータを1つではなく複数の関数に渡すという問題に直面しています。関数の名前が自動的に私がやったように、名前での機能にアクセスするのは難しいだろうことを意味生成され、機能がそのIを意味し、他の生成された関数の内部で生成することができますので

var generated_function = function(arg1, arg2, options_arg){ 
    ... 
    generated_function.default ... //do something with it 
    ... 
} 
generated_function.default = {} 

:このようにそれを行いますスコープの問題に対処する必要があります。だから、

、基本的に私は何を探していますがの線に沿って何かである:だから私は、この生成されたシナリオでは、このようにそれを使用することができます

var generated_function = function(arg1, arg2, options_arg){ 
    ... 
    containing_function.default ... //do something with it 
    ... 
} 
generated_function.default = {} 

(window[ somerandomlygeneratedstring ] = function(arg1, arg2, options_arg){ 
    ... 
    containing_function.default ... //do something with it 
    ... 
    (someobjectthatcannotbetracked[ somerandomlygeneratedstring ] = function(arg1, arg2, options_arg){ 
    ... 
    containing_function.default ... 
    ... 
    }).default = { ... } 

}).default = { ... } 

答えて

3

あなたが現在にアクセスすることができます機能はarguments.calleeを使用しています。ここで

var generated_function = function(arg1, arg2, options_arg){ 
    ... 
    arguments.callee.default ... //do something with it 
    ... 
} 
generated_function.default = {} 
+2

* strict.cでは* arguments.callee *は使用できません。関数式に名前を付けて使用する方がはるかに優れています。あるいは、単に関数宣言を使用してください。 – RobG

0

関数式はそう、関数内でのみ使用可能ですオプションの名前を持つことができます:生成されたすべての関数が同じ名前を持っていることは重要ではありません

var generated_function = function whatever(arg1, arg2, options_arg){ 
    ... 
    whatever.default ... //do something with it 
    ... 
} 

IEでバージョン8を含むnamed function expressionsにいくつかの問題がありましたが、名前が適切に選択されている場合は問題にはなりません。

など。

var fn0 = function foo(){ 
 
    console.log(foo.props.bar); 
 
} 
 
fn0.props = {bar:'f0 old bar'}; 
 

 
var fn1 = function foo(){ 
 
    console.log(foo.props.bar); 
 
} 
 
fn1.props = {bar:'f1 old bar'}; 
 

 
// Call fn0, change props, call again 
 
fn0(); 
 
fn0.props.name = 'f0 new bar'; 
 
fn0(); 
 

 

 
// Call fn1, change props, call again 
 
fn1(); 
 
fn1.props.name = 'f1 new bar'; 
 
fn1();

上記名は関数内でのみ使用可能であるため、複数の関数式に同じ名前を使用して微細であることを示しています。これは実質的に同じです:

var fn0 = function() { 
    var foo = arguments.callee; 
} 

厳密なモードでは安全です。

+0

私はそれがうまくいくとは思わない。メモリの問題を引き起こすことなく、どのように名前付き関数を繰り返し生成しますか?私は、関数オブジェクトの削除を避けるために、新しい関数の名前の選択を変更する必要があると思います。 –

+0

これは動作します、私は例を追加しました。どのように名前を追加するとメモリの問題が発生するのでしょうか?名前は関数内でのみ使用できます。そのため、再利用が可能です。 – RobG

関連する問題