假设我有一个函数dayToString
,定义如下:
function dayToString(n) {
return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][n];
}
够容易。用法可能如下所示:
var d = new Date();
var todayAsString = dayToString(d.getDay());
我的问题是,每次通话都会重新创建dayToString
内的数组,还是仅创建一次?
修改
澄清:我知道如何通过闭包或外部数组手动避免这种重新分配。澄清我原来的意图:当前的JavaScript引擎(V8,SpiderMonkey,JavaScriptCore,Chakra等)是否足够智能,以实现阵列是静态的,并且处理是这样的? JS规范中是否有某些东西阻止了这样的优化?
答案 0 :(得分:0)
是的,您正在定义它并在每次通话时返回它。为避免这种情况,请在函数外部进行定义:
var arrayOfDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
function dayToString(n) {
return arrayOfDays[n];
}
答案 1 :(得分: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];
}
})();
答案 2 :(得分:0)
这取决于运行时编译器。因此,无论是或否,这个问题都无法解决。
但我说,不,因为在编译器的视图中,函数只有一个实例,而且函数的内容是静态的。