何时不在javascript中使用“严格模式”?

时间:2017-06-16 11:05:57

标签: javascript ecma

我发现了这篇文章 - What does "use strict" do in JavaScript, and what is the reasoning behind it?

我在这里理解的是,我应该use strict 始终

但我想知道,如果确实如此,那么使用“严格模式”总是更好,那么它甚至不会存在,因为这将是一种默认行为。

所以我搜索了ECMAScript第6版的定义,发现它是很多情况的默认设置。

相应于official documentation about strict mode

  

可以使用其中任何一个处理ECMAScript脚本语法单元   无限制或严格模式语法和语义。代码被解释   作为以下情况下的严格模式代码:

     

G 最高级代码是严格模式代码,如果它以指令序言开头   包含使用严格指令(见14.1.1)。

     

M 模块代码始终是严格模式代码。

     

A ll部分ClassDeclaration或ClassExpression是严格模式代码。

     

E val代码是严格模式代码,如果它以包含Use Strict Directive的Directive Prologue开头,或者如果对eval的调用是直接eval(见12.3.4.1),则包含在严格的模式代码。

     如果关联的FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition或ArrowFunction包含在严格模式代码中,或者产生函数值的代码[

F ,则代码是严格模式代码。 [ECMAScriptCode]]内部插槽以包含使用严格指令的指令序言开头。

     作为内置函数和生成器构造函数的参数提供的

F 代码是严格模式代码,如果最后一个参数是一个String,处理时是一个以指令开头的FunctionBody包含使用严格指令的序言。

     

非严格模式代码的ECMAScript代码称为非严格   代码。

那么,何时使用非严格代码是个不错的选择?

提前致谢。

4 个答案:

答案 0 :(得分:22)

  

那么,何时不使用严格模式是个不错的选择?

当您运行旧的(或第三方)代码时,您还没有时间更新。

严格模式更好。它默认情况下不会打开,因为它会破坏未编写的旧代码。

答案 1 :(得分:10)

  

那么,何时不使用严格模式是个不错的选择?

在找到非声明变量时,严格模式会抛出引用错误。

如果你有这种无限制类型的代码,那就是使用变量而不声明。在某个函数/作用域内声明并在其他地方使用的一个变量(它将在那里未声明)并且您无法重写/更改它们,那么您不应该使用"use strict;"模式,因为它会破坏代码

来自MDN

严格模式对正常的JavaScript语义进行了一些更改。

  1. strict模式通过更改它们以抛出错误来消除一些JavaScript无提示错误。
  2. 严格模式修复了使JavaScript引擎难以执行优化的错误:严格模式代码有时可以比相同的代码(非严格模式)运行得更快。
  3. 严格模式禁止在ECMAScript的未来版本中定义某些语法。
  4. strict mode

    您不能像在非严格模式下那样使用变量而不是声明它们

    那是

    以下内容适用,因为它是非严格模式

    a = "Hello World";
    console.log(a);
    

    以下内容无法正常工作,因为它处于严格模式

    'use strict';
    a = "Hello World";  // => Throw a reference error
    console.log(a);
    

    上面的代码会抛出一个引用错误,因为使用了变量a而没有声明它。

    所以,你应该使用

    'use strict';
    var a = "Hello World";
    console.log(a);
    

    非严格模式下的示例

    
    
    a = "Hello World";
    console.log(a);
    
    
    

    严格模式下的示例,错误

    
    
    'use strict';
    a = "Hello World";
    console.log(a);
    
    
    

    严格模式下的示例,没有错误

    
    
    'use strict';
    var a = "Hello World";
    console.log(a);
    
    
    

    简而言之

    严格模式会限制你很多限制,但可能会提高MDN所说的性能。还减少了JavaScript引擎的负载。

    提示

    如果要从非严格模式迁移到严格模式,则应该非常小心每行代码和变量以及它们的范围。

答案 2 :(得分:4)

根据下面的MDN链接: -

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Strict_mode

  

浏览器中的严格模式

     

主流浏览器现在实施严格模式。但是,不要盲目   依赖于它,因为仍然有许多浏览器版本   只有部分支持严格模式的狂野或者不支持   完全支持它(例如,低于版本10的Internet Explorer!)。严格   模式改变语义。依靠这些变化会导致错误   浏览器中没有实现严格模式的错误。行使   谨慎使用严格模式,并备份依赖严格模式   功能测试,检查严格模式的相关部分是否   实现。最后,确保在浏览器中测试您的代码   并且不支持严格模式。如果您只在不适合的浏览器中进行测试   支持严格模式,您很可能在浏览器中遇到问题   那样做,反之亦然。

答案 3 :(得分:2)

  

那么,何时不使用严格模式是个不错的选择?

如果您的javascript代码是由第三方库生成或编译的,请添加其他答案。你不想用它来操纵,因为你没有写它。