这会在全球范围内实现“严格使用”吗?

时间:2011-06-26 12:02:18

标签: javascript strict

How to enable ECMAScript "use strict" globally?

类似,但不一样

我已经购买了JavaScript Patterns,并建议启用use strict。将它添加到二十几个javascript文件中会有点麻烦,所以在全局启用它会很好。我最初想过要添加到我的main.js的顶部:

"use strict" 
require({
    priority: ["jquery", "raphael", "myapp"] 
});

但是我认为它可能只会为该文件启用它。然后我想到了这个:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

其中任何一个是否会全局启用ECMAScript 5严格模式?

3 个答案:

答案 0 :(得分:42)

<强> TL; DR

不,一个"use strict"元素中的script不会对其他"use strict"元素中的代码强加script。它仅适用于它所属的源文本。

(另外,请在问题末尾添加script标记:如果script元素具有src,则其所拥有的任何内联文本都会被视为“文档”并被忽略。)


<强>更新

现在规范中更清楚了(可能在ES5中很清楚,但对我来说不是这样),是的,单独的script元素在"use strict"的目的上是分开的。原始答案中的下面引用been changed slightly表示“源文本”而不​​是“代码单元”,Scripts and Modules部分详细介绍。


原始回答

The specification说:

  

因为在语法代码单元的级别选择了严格模式,所以严格模式仅在这样的代码单元中施加具有局部效果的限制。严格模式不会限制或修改必须在多个代码单元中一致运行的ECMAScript语义的任何方面。

(第4.2.2节)

所以问题是:不同的script标记不同的语法代码单元吗?

V8(Chrome内部的JavaScript引擎)似乎认为他们 是分开的,因此在页面顶部的全局范围内放置一个"use strict";将无效。也许它已经指明了我还没有找到的地方,但无论如何,这是一个合理的解释。

假设foo未声明未显示,则此代码在正常模式下成为The Horror of Implicit Globals的牺牲品:

function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}

在正常模式下,它会创建一个值为“bar”的新全局变量foo并显示"foo = bar"消息。在严格模式下,抛出异常,因为foo未定义。

如果我将此脚本标记放在页面中:

<script>
"use strict";
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

...我按预期得到了异常(live example)。如果我将它们放在单独的script标签中,但是:

<script>
"use strict";
</script>
<script>
function test() {
    try {
      foo = "bar";
      display("foo = " + foo);
    }
    catch (e) {
      display("Exception: " + e);
    }
}
</script>

获得异常(在V8上)(example)。如果您考虑浏览器和JavaScript引擎的交互方式,这是合理的。

同样,如果该功能在另一个文件中关闭,我这样做:

<script>
"use strict";
</script>
<script src="/inatoq"></script>

我没有得到例外(example),大概是出于同样的原因。

请注意您的示例代码:

<script data-main="lib/main" src="lib/require.js">"use strict"</script>

无效。 script代码可能 (好吧,基本上;详细信息here [HTML5]和here [HTML 4.01]。)如果它有一个src元素,浏览器应该忽略内容,大多数都这样做。最。 : - )

答案 1 :(得分:8)

JSLint is suddenly reporting: Use the function form of "use strict"

(function () {
    "use strict";
    // put all of your strict code here


}());

答案 2 :(得分:6)

不,脚本标记被视为programs,因此code units"use strict"不应该从一个脚本标记转移到另一个脚本标记。

每个脚本标记都是单独解释的,实际上有自己的范围。这个范围并不明显,因为全局声明的所有内容都将最终出现在全局对象上,但它仍然存在。字符串"use strict"将在program / script标记的末尾进行垃圾回收,因为它没有指针/引用。