是否会在每次调用时重新创建JavaScript函数内的数组?

时间:2016-03-20 18:07:56

标签: javascript function v8 spidermonkey javascriptcore

假设我有一个函数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规范中是否有某些东西阻止了这样的优化?

3 个答案:

答案 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)

这取决于运行时编译器。因此,无论是或否,这个问题都无法解决。

但我说,不,因为在编译器的视图中,函数只有一个实例,而且函数的内容是静态的。