Javascript 效率有多高;加上;陈述

Javascript 效率有多高;加上;陈述,javascript,performance,Javascript,Performance,很难在谷歌上搜索像“with”这样的关键词,所以我在这里试着提问 JavaScript中的with语句是否效率低下 例如,假设我有: with(obj3) { with(obj2) { with(obj1) { with(obj0) { eval("(function() { console.log(aproperty) })();"); } }

很难在谷歌上搜索像“with”这样的关键词,所以我在这里试着提问

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

例如,假设我有:

with(obj3) {
     with(obj2) {
         with(obj1) {
               with(obj0) {
                    eval("(function() { console.log(aproperty) })();");
               }
         }
     }
}
例如,如果我浏览obj0、obj1、obj2、obj3并将它们合并在一起,然后使用以下任一方法,上述方法的效率会更高还是更低:

  • 只有陈述的人
  • 使用obj0、obj1、obj2和obj3键创建了一个参数字符串,并为值创建了一个args数组,用于:

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

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

    较新的浏览器有一个内部标记机制,使javascript解释更便宜。这与较新JVM中的JIT非常相似。我认为你的嵌入式with-s没有太大问题,实际上会有一些类似的问题

    __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,则需要标记化


    我投票赞成第一个版本。

    语句将使代码运行为1980。实际上,在JIT中实现的每一个优化都不能在其生效时使用。

    如果您正在寻找选项,那么您可能需要考虑第三种方法,即,如果需要的话,立即创建(一个对象)原型链。
    编辑:我的解决方案已损坏。它需要非标准的
    \uuuu proto\uuu
    属性。我正在更新以修复它,但请注意,并非所有环境都支持此功能



    您可能不应该使用with语句:哇,
    with
    eval
    。这就像克罗克福德最可怕的噩梦一样-我不认为这是一个很好的方法,但它不应该因为不是最佳实践而被否决-这个问题表达得很好,我对答案很感兴趣。而且,对于所有认为这很荒谬的人来说,使用这种精确的方法是值得注意的。对不起,各位,我错过了上次编辑中没有调用方法的内容。再试一次:获胜者似乎是很多Evals:)我会考虑使用函数,但我有把握第一部分是什么,然后你在哪里使用结果?以下是测试(但没有您的测试)@MoJS:结果将类似于您的合并对象,只是没有合并。只是一个对象的原型链。链中的第一个对象将是空对象,因此您可以实际添加属性而不影响其他属性。下一个对象是
    obj0
    ,后跟
    obj1
    ,等等。因此,当您查找属性时,它将按照
    first>obj0>obj1>obj2>obj3
    的顺序查找它。假设属性
    foo
    位于
    obj1
    obj3
    上。您将从
    obj1
    中获得值,因为它在
    obj3
    上隐藏了相同的属性@MoJS:我必须说,我不理解代码中函数的用途。是的,我也不理解。。。但是最后一个函数确实调用了一个函数,所以要真正比较它们,其他函数也应该声明并调用一个方法。我之前错误地编写了测试,忘记了调用这些方法。重试:关于新函数()。。。除非浏览属性,否则实际上无法获取函数的参数。。。对于eval,这不是必需的。没有obj.getKeys()对吗?是的,你是对的。尽管他们看起来很平等:我也是,尽管流浪汉赢了(我也是)。但这个评估很简单。也许JS引擎可以以某种方式避免这个JS的重复标记化。也许在求值字符串中添加“/”+Math.rand()会使差异更加明显。恭喜你考上了!不抱歉,我已经编写了代码,但忘记实际运行它,所以它只是方法声明:S。。。这里又是:)您的基准测试有缺陷,因为“no-with”版本使用的是直接eval,它与with语句有完全相同的问题,因为它会导致动态错误scoping@Esailija我不知道你是什么意思,那么考试的安排是什么呢?
    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();
    
    var props = ["x2","b1","a3"];
    var product = result.y3;
    
    for (var i = 0; i < props.length; i++)
        product *= result[props[i]];