How efficient is the "with" statement?

How efficient is the "with" statement?

本文关键字:quot statement with efficient How is the      更新时间:2024-03-04

很难在谷歌上搜索一些关键词,比如"with"word,所以我在这里测试询问。

JavaScript中的with语句是否效率低下?

例如,假设我有:

with(obj3) {
     with(obj2) {
         with(obj1) {
               with(obj0) {
                    eval("(function() { console.log(aproperty) })();");
               }
         }
     }
}

例如,如果我遍历obj0、obj1、obj2、obj3并将它们合并在一起,然后使用其中一个:

  1. 一个单独声明
  2. 创建了一个参数字符串,其中包含obj0、obj1、obj2和obj3键,以及值的args数组,并使用:

    eval("function fn(aproperty, bproperty) { console.log(aproperty); }")
    fn.apply(undefined, args);
    

这三种方法中哪一种可以被认为更快?我一直在猜测语句,但有这么多语句让我觉得我可以进一步优化它。

如果您正在寻找选项,那么您可能需要考虑第三种方法,即创建(如果需要,可以动态创建)对象的原型链。


编辑:我的解决方案被破坏了。它要求非标准的__proto__属性。我正在更新以修复它,但请注意,并非所有环境都支持此功能


var objs = [null,obj3,obj2,obj1,obj0];
for (var i = 1; i < objs.length; i++) {
    objs[i].__proto__ = Object.create(objs[i-1]);
}
var result = objs.pop();

这避免了with,并且应该比合并更快,尽管只有测试才能说明问题。


然后,如果你所需要的只是某种性质的产品,这将是非常快的。

var props = ["x2","b1","a3"];
var product = result.y3;
for (var i = 0; i < props.length; i++)
    product *= result[props[i]];

较新的浏览器有一个内部标记机制,可以使javascript解释更便宜。它非常像新JVM中的JIT。我认为你的深度嵌入没有太大问题,实际上它会像一样

__get_aproperty() {
    if (obj0.has("aproperty")) return obj0.aproperty;
    if (obj1.has("aproperty")) return obj1.aproperty;
    if (obj2.has("aproperty")) return obj2.aproperty;
    if (obj3.has("aproperty")) return obj3.aproperty;
}

因此,js的结构是高度嵌入的,但浏览器的js引擎中实际执行的结构将是简单和线性的。

但是JS的标记化是昂贵的。如果JS引擎找到一个eval,则需要标记化。

我投票支持第一个版本。

With语句将使您的代码像1980年一样运行——实际上,JIT中实现的每一个优化在生效时都无法使用。