3

我最近在 JS 中做了很多模板,所以我总是遇到“邪恶”的with说法。

它使模板更容易使用,因为您不必在变量前面加上对象。

听说 with 语句不好,而且它们可能导致性能不佳,我开始寻求另一种解决方案:

我的解决方案:带有一堆参数的函数

这是我的代码:

var locals = {
  name : "Matt",
  email : "wahoo@wahoo.com",
  phone : "(555) 555-5555"
};

var keys = [];
var values = [];

for (key in locals) {
  local = locals[key];

  keys.push(key)
  values.push(local);

}

keys = keys.join(',');

var fn = new Function(keys, "**TEMPLATE STUFF**"); // function(name, email, phone) {...}
fn.apply(this, values); // fn("Matt","wahoo@wahoo.com","(555) 555-5555")

注意:这些完成完全相同的事情。两者都是从任何人那里抽象出来的,所以一个令人讨厌的长参数列表并不是什么大问题。

我想知道哪个更好:使用 with 语句或可能包含大量参数的函数。

除非有人有更好的解决方案......?

谢谢!马特·穆勒

4

3 回答 3

1

Have you tried a JS templating engine? They are usually very fast, and save you some rendering code.

I'm the author of pure.js which is a bit original, but there are plenty of others available and for any taste.

于 2011-04-14T09:16:40.313 回答
1

我发现您的解决方案非常臃肿。它完全不平凡,却又with如此简单(一行代码本身与您的对象遍历和数组实例化相比成本非常低)。此外,您的解决方案需要在制作模板函数(以定义其参数)时准备好模板对象,这在我看来可能会变得不那么灵活。

查看MDC。一个设计良好的模板可能会有很少的逻辑和大量的变量引用(如果不是这样,那么它应该是!),这使得with在这种情况下成为完美的候选者,因为在的范围with

任何可能获得的额外性能似乎都是微优化,尽管不是理论上的,只是执​​行一些基准测试。http://jsperf.com/with-vs-fn在您的版本的基准测试之前完成所有设置代码,但with在函数执行期间执行这些东西,所以这并不公平,尽管即使在最慢的迭代中您也会有所了解它有多快;>400,000 ops/sec 是最慢的。我怀疑您是否需要每秒渲染超过 400,000 个模板...

于 2011-04-14T08:29:07.220 回答
0

问题with不是性能,而是模棱两可和不可预测的行为。

例如,参见JavaScript 的隐藏特性?

于 2011-04-14T09:14:27.527 回答