【问题标题】:"use strict" in JavaScript doesn't work?JavaScript 中的“使用严格”不起作用?
【发布时间】:2013-01-03 17:49:10
【问题描述】:

根据this article

在 JavaScript 代码中添加“use strict”作为第一条语句¹ 将在整个范围内强制执行严格模式

那为什么:

"use strict";
012; 

不抛出错误

同时

(function () {
    "use strict";
    012; })();

有吗? (严格模式下不允许使用八进制文字。)

John resig says nothing about it. he just says :

简单。把它扔在程序的顶部,以使整个程序都启用它 脚本:

"使用严格";或者将它放在一个函数中以打开严格模式 仅在这种情况下。

function imStrict(){ "使用严格"; // ... 你的代码 ... }

编辑:

编辑#2。

我在控制台中测试了代码。(chrome)。在 jsbin 示例中 - 它正在工作。仍然,我不明白为什么它在控制台中的行为不同。

【问题讨论】:

  • 如果你在一行中执行"use strict"; 012;会发生什么?
  • @melpomene 相同。刚刚测试过。
  • 好吧,那么无论你使用什么作为 REPL 都不支持顶级 "use strict"
  • 不要在控制台中测试代码并期望相同的行为。
  • 控制台不是一个纯粹的环境。使用任何其他严格模式示例,您会看到它禁用了全局严格声明,例如foo="bar"(无声明)。这不是应用程序代码的情况,它实际上很重要。此外,控制台中定义的方法通常在应用程序代码中不可用。底线...如果您在控制台中看到奇怪的行为,请首先在实际应用程序中进行验证。

标签: javascript


【解决方案1】:

确实抛出一个错误。

quentin@workstation:~ # cat > tmp/foo.js
"use strict";
012; 

quentin@workstation:~ # node tmp/foo.js

/users/quentin/tmp/foo.js:2
012; 
^^^

module.js:434
  var compiledWrapper = runInThisContext(wrapper, filename, true);
                        ^
SyntaxError: Octal literals are not allowed in strict mode.
    at Module._compile (module.js:434:25)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:31)
    at Function._load (module.js:311:12)
    at Array.0 (module.js:484:10)
    at EventEmitter._tickCallback (node.js:190:38)

【讨论】:

  • @RoyiNamir - 所以要么你执行它的地方有些奇怪,要么那里有一个错误。问题出在你的工具上。
【解决方案2】:

控制台的行为方式与其他地方不同,请尝试在浏览器中打开以下内容,您会看到错误再次出现,而无需将其包装在函数中。

<!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>use strict</title>
        <script>
"use strict";
012;
        </script>
    </head>
    <body>
    </body>
</html>

您可以通过输入~+ 等来判断控制台的实现方式与直接执行不同(您将获得SyntaxError: Unexpected token })。
可以通过直接编写这样的代码来重现类似的行为(我不会将其称为相同,因为我不知道控制台是如何做到的)

example: { // labeled block
    "use strict"; // your code
    012;
} // end of block, no SyntaxError thrown for strict

【讨论】:

  • 我认为它应该提供相同的结果。
  • 查看我的编辑#2。我很高兴获得一个示例,说明哪个控制台的行为不像正常的流动代码。 (本示例除外)。
  • 区别在于控制台的实现方式;例如,尝试在控制台中只输入~+ 等,你会得到一个SyntaxError: Unexpected token },这意味着代码在执行之前正在被控制台解析和包装,这与执行不同直接。
  • @RoyiNamir 我希望我的编辑能为你提供更多的启示。
  • 谢谢。但是控制台中的结果是 10。(您的最后一个代码)。我猜控制台只是以不同的方式处理。 (每个人都这么说。没有人说明原因)。
【解决方案3】:

012 是一个八进制文字,在严格模式下是不允许的,因为它已被 ECMA-262 的第 3 版弃用。 JavaScript 1.5 仍然支持八进制整数文字以实现向后兼容性。并且您的示例正在引发错误!

你有 3 种可能性。

  1. 删除那个八进制文字

  2. 不要使用严格模式

  3. 或者您可以先使用八进制文字,然后将所有代码包装在一个匿名函数中,并将严格模式限制为您立即调用的函数表达式 (iife):

012;

(function () {
  "use strict";

  ... your code
})();

【讨论】:

  • 问题是“如何使用程序级"use strict"(控制台中的演示)抛出严格代码错误(以八进制文字作为演示)?”你的答案与此无关
  • 不,这不是问题。问题是,为什么给定的例子没有抛出错误(但它是!)。
猜你喜欢
  • 1970-01-01
  • 2021-06-12
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2017-11-19
  • 2016-07-25
相关资源
最近更新 更多