0

我有这段代码,为了这个问题我简化了:

//var a is generated once at runtime
//from an array of strings
//and an array of functions
var a = [ 
            "Start ",
            function(){return "middle ";}, //returns dynamic data
            "end"
        ],
    c = "";

//this for-loop represents a call
for(var i = 0; i < a.length; i++){
    var d = typeof a[i] === 'function' ? a[i]() : a[i];
    c = c.concat(d);
}
console.log(c);

现在第一个问题:我的调用(for 循环)是否比说...

var call = a[0]+a[1]()+a[2];

...在运行时以某种方式创建了调用?

条件问题:如果后一种调用是更优的方法,那么我将如何生成这个最优的调用变量/对象/函数?

最后一个条件问题:如果您无法弄清楚我在最后一个问题中要问的内容,请忽略它。相反,请告诉我我的代码是否能够进一步优化以及如何优化?!

编辑:我继续通过运行 24M 调用对我的代码进行基准测试,调用变量比我的估计快了大约 10%。

4

2 回答 2

0

这里的主要答案是:for循环不会引入任何你会注意到的性能损失。

但:

如果a是在运行时生成的,你必须有一些东西,在某处生成它。如果是这样,而不是一个数组,为什么不直接生成一个函数呢?

var acall = function() {
  return "Start, " + dynamic() + "end";
};

或者

var acall = function() {
  return "Start, " + (function() {
    return "middle ";
  })() + "end";
};

真正的症结在于如何 a在运行时生成。您通常可以在运行时生成函数,而无需求助于eval或其表亲new Function...

于 2012-05-25T21:41:08.597 回答
0

虽然正确,并且在性能方面很好,但这段代码对我来说并不合适。我会做的是:

var a = [ 
  "Start ",
  function(){return "middle ";}, //returns dynamic data
   "end"
];

var c = a.map(function(item) {
  return typeof item === 'function' ? item() : item;
}).join('');

console.log(c);

这对我来说似乎比在每次for迭代中附加到你的字符串更好。

于 2012-05-25T21:43:29.967 回答