4

根据 这篇文章

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

所以为什么 :

"use strict";
012; 

不抛出错误

尽管

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

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

约翰雷西格对此只字未提。他只是说:

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

“使用严格”;或者将它放在一个函数中,仅在该上下文中打开严格模式。

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

编辑 :

在此处输入图像描述

编辑#2。

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

4

3 回答 3

2

确实会引发错误。

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)
于 2013-01-20T14:53:52.367 回答
1

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

<!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
于 2013-01-20T15:11:10.357 回答
-1

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

你有 3 种可能性。

  1. 删除那个八进制文字

  2. 不要使用严格模式

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

012;

(function () {
  "use strict";

  ... your code
})();
于 2013-01-20T15:12:35.390 回答