16

“使用严格”;看起来很棒,我们真的很想在我们的商店使用它。但是,我们只是想要它,以便我们(开发人员)可以找到严格性问题;我们非常不想让我们的网站在之前运行良好的情况下为我们的实际客户中断。

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

{% if debug %}<script>"use strict";</script>{% endif %}

...除了“使用严格”在逐个文件的基础上运行,因此实际上不会起作用(好吧,除非我们开始在服务器端处理我们所有的 JS 文件)。

所以,我的问题是:在页面加载时是否会检查所有“使用严格”检查的内容,或者“使用严格”是否有可能在页面加载后发现错误? 如果是前者,我们可以直接使用“use strict”,不用担心,因为我们会先在开发中加载我们的网站,然后再加载到现场。但是,如果是后者,我们似乎不走运,因为我们无法测试所有可能的运行时条件(同样,我们不想在之前没有错误的情况下为我们的用户犯错误)。

4

2 回答 2

13

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

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

例如

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

foo();

这会抛出

"ReferenceError: assignment to undeclared variable bar"

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

进一步阅读MDN

于 2012-04-11T23:30:32.990 回答
6

如果我理解正确,是的,严格模式绝对有可能在页面加载后捕获错误。例如:

'use strict';

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

// 点击这里查看演示。

你可以做的很简单:当你转移到生产环境时,你应该缩小你的 JavaScript。只要确保'use strict'在缩小过程中被删除。

如果做不到这一点,请尝试确保您的代码没有严格错误。严格模式通常在语义方面发挥作用,而不是因为用户输入奇怪,甚至不是因为语法。抓住所有病例应该不会太难。(但缩小和删除'use strict'是一个更好的解决方案。)

于 2012-04-11T23:32:25.333 回答