Live use是否"使用严格"安全?

mac*_*ost 16 javascript use-strict

"严格使用"; 看起来很棒,我们真的很想在我们的商店使用它.但是,我们只是想要它,以便我们(开发人员)可以找到严格性问题; 我们非常不希望我们的实际客户在以前工作正常的时候让我们的网站中断.

现在,我们可以使用一些服务器端逻辑来实现这一点:

{% if debug %}<script>"use strict";</script>{% endif %}
Run Code Online (Sandbox Code Playgroud)

...除了"use strict"在逐个文件的基础上运行,因此实际上不会工作(好吧,除非我们启动服务器端处理我们所有的JS文件).

所以,我的问题是:在页面加载时执行所有"使用严格"检查以获取检查,或者在页面加载后"use strict"是否可以找到错误? 如果它是前者,我们可以使用"use strict"并停止担心,因为我们会在开发之前加载我们的网站,然后再加载它.但是,如果是后者,我们似乎运气不好,因为我们无法测试每个可能的运行时条件(同样,我们不希望在之前没有错误时为我们的用户制造错误).

jAn*_*ndy 13

这是后者.在进入时strict mode,Javascript解释器可能会在运行时抛出错误消息,这不会在非严格模式下抛出.

另一方面,大多数这些错误都是"错误",这意味着它们实际上有助于不破坏您的代码.

例如

function foo() {
    "use strict";
    bar = true;
}

foo();
Run Code Online (Sandbox Code Playgroud)

这将抛出

"ReferenceError: assignment to undeclared variable bar"
Run Code Online (Sandbox Code Playgroud)

在严格模式下,这是一个很好的事情.在非严格模式下,我们只会创建一个名为的全局变量bar,这可能不是我们想要的.还有很多其他情况会strict mode阻止程序员做一些愚蠢/糟糕/不需要的事情并抛出错误消息.但同样,你想要有这些错误而不是一些奇怪的错误.

进一步阅读MDN

  • 首先,谢谢你的回答; 它完全解释了事情(看起来我只是运气不好).但有一点:你一直说严格错误是"*好*",但"好"是非常主观的.虽然我同意全局变量是坏的,但我认为它有一个以前工作正常的页面突然停止为客户工作的方式非常糟糕.如果严格错误可以防止客户错误,则严格错误只是"好"; 如果他们造成这样的错误,那就更糟糕了(假设你的最终目标是为你的客户提供一个工作网站,而不仅仅是抽象的"完美"代码). (2认同)

Ry-*_*Ry- 6

如果我理解正确,是的,严格模式肯定可以在页面加载后捕获错误.例如:

'use strict';

setTimeout(function() {
    undefined = 42; // Causes a TypeError
}, 1000);

// Click here for a demo.

您可以做的非常简单:无论如何,当您转向生产时,您应该缩小JavaScript.只需确保'use strict'在缩小过程中删除.

如果做不到这一点,只需尝试确保您的代码严格无错误.严格模式通常在语义方面发挥作用,而不是因为用户输入的奇怪之处或者甚至是因为语法.赶上所有案件都不应该太难.(但缩小和移除'use strict'是一个更好的解决方案.)