【问题标题】:When to NOT use "strict mode" in javascript?何时不在 javascript 中使用“严格模式”?
【发布时间】:2017-11-19 03:22:14
【问题描述】:

我找到了这个帖子-What does "use strict" do in JavaScript, and what is the reasoning behind it?

我在这里的理解是我应该use strict总是

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

于是我搜索了ECMAScript 6th edition的定义,发现很多情况下都是默认的。

official documentation about strict mode

ECMAScript 脚本句法单元可以使用以下任一方式处理 不受限制或严格模式的语法和语义。代码被解释 在以下情况下作为严格模式代码:

Global 代码如果以 Directive Prologue 开头,则为严格模式代码 包含使用严格指令(见 14.1.1)。

Module 代码始终是严格模式代码。

所有部分的 ClassDeclaration 或 ClassExpression 都是严格模式代码。

Eval 代码是严格模式代码,如果它以包含 Use Strict 指令的 Directive Prologue 开头,或者如果对 eval 的调用是包含在严格模式代码。

F如果相关的 FunctionDeclaration、FunctionExpression、GeneratorDeclaration、GeneratorExpression、MethodDefinition 或 ArrowFunction 包含在严格模式代码中,或者生成函数 [ [ECMAScriptCode]] 内部插槽以包含使用严格指令的指令序言开始。

F作为参数提供给内置函数和生成器构造函数的函数代码是严格模式代码,如果最后一个参数是一个字符串,在处理时是一个以指令开头的函数体包含使用严格指令的序言。

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

那么,什么时候使用非严格代码比较合适?

提前致谢。

【问题讨论】:

  • 它不能在浏览器中默认,因为仍然有很多应用程序在互联网上用旧版本的 javascript 编写,如果给定的浏览器默认引入use strict,它会破坏这些应用程序(遗留代码)。正如您所说,对于所有新应用程序,建议始终使用use strict。 :)
  • 只使用严格。如果不支持,旧版浏览器将忽略 use strict。没有,什么时候不用。
  • use strict 在这里提供了一种克制/更安全的体验(因此很严格)。想用就用,不想用就别用。

标签: javascript ecma


【解决方案1】:

根据下面的 MDN 链接:-

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

浏览器中的严格模式

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

【讨论】:

    【解决方案2】:

    那么,什么时候不使用严格模式是个好选择?

    严格模式在发现未声明的变量时会抛出引用错误,在某些情况下。

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

    来自MDN

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

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

    当在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 引擎的负载。

    提示

    如果你想从非严格模式迁移到严格模式,你应该非常小心每一行代码和变量以及它们的作用域。

    【讨论】:

    • 这并没有真正解决“何时不在 javascript 中使用‘严格模式’?”的问题
    • 另外,使用 console.log(),而不是 alert(),这就是为什么 stack sn-ps 有控制台包装器,它不那么烦人。
    【解决方案3】:

    那么,什么时候不使用严格模式是个好选择?

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

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

    【讨论】:

      【解决方案4】:

      那么,什么时候不使用严格模式比较好?

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

      【讨论】:

      • 如果生成代码,生成有无"use strict",反正你也拿不定主意?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多