34

我找到了这篇文章- “使用严格”在 JavaScript 中做了什么,其背后的原因是什么?

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

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

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

根据有关严格模式的官方文档

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

如果全局代码以包含使用严格指令的指令序言开头(参见14.1.1),则它是严格模式代码。

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

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

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

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

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

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

那么,什么时候使用非严格代码是一个不错的选择呢?

提前致谢。

4

4 回答 4

32

那么,什么时候不使用严格模式是一个不错的选择呢?

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

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

于 2017-06-19T14:51:24.450 回答
13

那么,什么时候不使用严格模式是一个不错的选择呢?

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

如果你有这样一个无限制类型的代码,那就是使用变量而不声明。在某个函数/范围内声明并从其他地方使用的一个变量(它将在那里未声明)并且您无法重写/更改它们,那么您不应该使用"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 引擎的负载。

小费

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

于 2017-06-19T14:47:55.530 回答
4

根据下面的 MDN 链接:-

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

浏览器中的严格模式

主流浏览器现在都实现了严格模式。但是,不要盲目地依赖它,因为仍然有许多浏览器版本在野外使用,它们仅部分支持严格模式或根本不支持它(例如 Internet Explorer 版本 10 以下!)。严格模式改变语义。依赖这些更改会导致未实现严格模式的浏览器出现错误和错误。谨慎使用严格模式,并通过功能测试来支持对严格模式的依赖,以检查严格模式的相关部分是否已实现。最后,确保在支持和不支持严格模式的浏览器中测试您的代码。如果您只在不支持严格模式的浏览器中进行测试,那么您很可能在支持严格模式的浏览器中遇到问题,反之亦然。

于 2017-06-16T11:39:54.863 回答
2

那么,什么时候不使用严格模式是一个不错的选择呢?

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

于 2017-06-19T20:48:30.787 回答