2016-03-20 1 views
0

は私のような定義された関数、dayToStringを、持っていると仮定します。使い方は次のようになります:JavaScript関数内の配列はすべての呼び出しで再作成されますか?</p> <pre><code>function dayToString(n) { return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][n]; } </code></pre> <p>十分に簡単:

var d = new Date(); 

var todayAsString = dayToString(d.getDay()); 

私の質問は、dayToString内の配列は、すべての呼び出しに再作成されている、またはそれは一度だけ作成されますか?

編集

明確化:私は手動で閉鎖または外部の配列を経由してこの再割り当てを回避する方法を知っています。私の本来の目的を明確にする:現在のJavaScriptエンジン(V8、SpiderMonkey、JavaScriptCore、Chakraなど)は、配列が静的であり、扱いがそのままであることを認識するのに十分スマートですか?このような最適化を妨げるJS仕様にはおそらく何かがありますか?

答えて

0

はい、それを定義し、すべての呼び出しを返します。これを避けるには、関数外で定義します。

var arrayOfDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
function dayToString(n) { 
    return arrayOfDays[n]; 
} 
+0

私は再割り当てを想定したことを避けるためにこの方法を知っていますが、この質問はV8、JSCに合わせて調整されていて、友人はこの静的なアイテムを関数内で見ることができ、 。 –

0

はい、配列は毎回再作成されます。

1)機能にstatic propertyをエミュレート:だけのことができたら、アレイを作成するには

dayToString.weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
function dayToString(n) { 
    return dayToString.weekDays[n]; 
} 

2)または単離されたclosure to keep the week daysを作成します。

var dayToString = (function(n) { 
    var weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; 
    return function(n) { 
    return weekDays[n]; 
    } 
})(); 
+0

あなたの2の細かいトリックは、配列をとりクロージャを返す関数に一般化するのに十分頻繁に使用しますが、私の質問は、JSエンジンがどのように "スマート"なのかという疑問をより深く意味します。アレイは自分自身で静的であると認識し、それをそのように扱いますか? –

+0

@HoagyCarmichaelそれは実装に依存し、エンジンがこの部分を最適化できる大きな可能性があります。しかし、JavaScriptの仕様では、スコープが関数呼び出しのたびに再作成されるので、これをコーディング段階で議論することはしません。 –

0

それが依存ランタイムコンパイラで。ですから、質問はイエスかノーで質問されることはありません。

しかし、コンパイラの観点から見ると、関数のインスタンスは1つしかなく、関数の内容は静的であるため、いいえ、いいます。

+0

これは私が質問したときに検討していた最適化の一種です。私はV8、JSCなどのソースに十分に精通していないので、この最適化が妥当な時間内に行われたかどうかを確認することはできませんが、あなたの主張を裏付けるものがあれば、 –

関連する問題

 関連する問題