Javascript 严格模式更有效吗?

Javascript 严格模式更有效吗?,javascript,Javascript,一般来说,在浏览器中以“严格模式”执行javascript是否会提高性能?是否有任何主流浏览器进行了额外的优化或使用了任何其他技术来提高严格模式下的性能 稍微换一句话,严格模式的目的之一是允许浏览器引入额外的优化或其他性能增强吗?严格模式实际上不是关于性能,它是语言的一部分,其主要目的是避免被认为是容易出错的功能 基本上,它的目标是使语言更安全,引入了大量的语义更改,还进行了额外的错误检查,并且错误比较多,在非严格的代码中,事情只能默默地失败 关于性能,我认为浏览器供应商现在很难实现严格模式,问

一般来说,在浏览器中以“严格模式”执行javascript是否会提高性能?是否有任何主流浏览器进行了额外的优化或使用了任何其他技术来提高严格模式下的性能

稍微换一句话,严格模式的目的之一是允许浏览器引入额外的优化或其他性能增强吗?

严格模式实际上不是关于性能,它是语言的一部分,其主要目的是避免被认为是容易出错的功能

基本上,它的目标是使语言更安全,引入了大量的语义更改,还进行了额外的错误检查,并且错误比较多,在非严格的代码中,事情只能默默地失败

关于性能,我认为浏览器供应商现在很难实现严格模式,问题是JS引擎大多基于ECMAScript 3,实现严格模式并不容易,因为严格的范围非常灵活,可以混合使用非严格和严格的代码

另见:

strict mode的其他目标之一是允许浏览器引入额外的优化或其他性能增强吗

我不确定它是否打算这样做,尽管我认为答案是肯定的


但我可以肯定地说,strict模式确实提供了这些机会,浏览器将实现这些机会——不管提供这些机会是否是ECMA委员会的有意目标。然而,我并不期望所有这些机会都能立即被抓住。在许多情况下,咒语可能是先正确,后性能,因为严格模式目前没有广泛使用。(我在Mozilla的JavaScript引擎上工作,并实现了strict模式的各个部分,我们以这种方式实现它,作为一条一般规则——尽管如果我尝试的话,我可能会想到一两个例外。)

在大多数情况下,没有。如果仔细查看ECMAScript 5标准文档,您会发现几乎所有出现在伪代码算法中的严格模式都是:

  if (isStrictMode) {
      //throw an (early) SyntaxError or TypeError
  }
  else {
      //return
  }
有两件事需要注意:

  • ECMAScript 3中不存在对严格模式的检查。虽然它相对轻量级,但与ECMAScript 3的对应版本相比,JavaScript的一致性实现现在至少运行了一个额外的条件检查。是的……我知道像这样的一张支票只会消耗很少的时钟周期,但积少成多
  • 因为严格模式主要是JavaScript的一种解析时功能,所以当某些网站(如SunSpider)启用严格模式时,您最喜欢的浏览器不会显示太多性能下降。也就是说,性能降低发生在执行代码之前,这意味着最终用户可以感觉到,但使用Date对象来测量块执行时间在很大程度上是不可测量的
  • 根据这个测试,“严格模式”可以快25%左右

    <div id="a">
      Q
    </div>
    <div id="b">
      Q
    </div>
    <script>
      Benchmark.prototype.setup = function() {
        function d(i) {
          var x = '999';
          y = eval("y = 8;");
          var z = x + y + i;
          document.getElementById('a').innerHTML = z;
        }
    
        function c(i) {
          'use strict'
          var x = '999';
          var y = eval("y = 8;");
          var z = x + y + i;
          document.getElementById('b').innerHTML = z;
        }
      };
    </script>
    
    
    Q
    Q
    Benchmark.prototype.setup=函数(){
    职能d(i){
    变量x='999';
    y=eval(“y=8;”);
    var z=x+y+i;
    document.getElementById('a').innerHTML=z;
    }
    职能c(i){
    “严格使用”
    变量x='999';
    变量y=eval(“y=8;”);
    var z=x+y+i;
    document.getElementById('b').innerHTML=z;
    }
    };
    
    这可以在这里进行测试:
    有趣的是,在“严格模式”下,参数数组的操作速度可以快6倍左右

    
    Benchmark.prototype.setup=函数(){
    var nonstrict=(函数(){
    返回函数(arg1){
    var指数;
    for(索引=1;索引

    以下是jsPerf测试:

    现在哪些浏览器支持ECMAScript 5?@Jamie@Jamie Wong-请参阅@Matthew:nice链接@sje397:该列表中唯一完整的ECMAScript 5实现是BESEN(从未听说过),它的主页上写道:“严格的代码比非严格的代码运行得快,因此请尽可能使用“使用严格的”IIRC Douglas Crockford声称,带有
    关键字的
    不仅表现糟糕,而且在语言中使用它会使整个语言变慢。从CMS的回答来看,带有
    关键字的
    在严格模式下不起作用,因此这似乎表明至少有可能提高一些速度。链接+1。不过,我不太明白第三句话与性能有什么关系。from(似乎可信):“John[Resig]没有提到的是,严格模式可能会带来更高的性能。如果浏览器被告知“我声明此代码正确无误”,它可以花更少的时间处理歧义,并着手处理手头的事务。@sje397:strict
    模式的另一个好处是,如果函数声明局部变量
    foo
    ,并且不定义任何捕获它的嵌套函数,它在第一次读取之前将数字存储到
    foo
    ,并且从不将数字以外的任何内容存储到
    foo
    ,那么调用的函数(或任何其他内容)就无法使
    foo
    保存数字以外的任何内容。很容易确定上述条件是否成立,而且处理数字的速度比wor快得多
    <script>
      Benchmark.prototype.setup = function() {
        var nonstrict = (function() {
            return function (arg1) {
                var index;
                for (index = 1; index < arguments.length; ++index) {
                    arguments[0] += arguments[index];
                }
                return arguments[0] - arg1;
            };
        }());
        var strict = (function() {
            "use strict";
            return function (arg1) {
                var index;
                for (index = 1; index < arguments.length; ++index) {
                    arguments[0] += arguments[index];
                }
                return arguments[0] - arg1;
            };
        }());
        var result;
      };
    </script>