与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严格模式?
答案 0 :(得分:42)
<强> TL; DR 强>:
不,一个"use strict"
元素中的script
不会对其他"use strict"
元素中的代码强加script
。它仅适用于它所属的源文本。
(另外,请在问题末尾添加script
标记:如果script
元素具有src
,则其所拥有的任何内联文本都会被视为“文档”并被忽略。)
<强>更新强>:
现在规范中更清楚了(可能在ES5中很清楚,但对我来说不是这样),是的,单独的script
元素在"use strict"
的目的上是分开的。原始答案中的下面引用been changed slightly表示“源文本”而不是“代码单元”,Scripts and Modules部分详细介绍。
原始回答:
因为在语法代码单元的级别选择了严格模式,所以严格模式仅在这样的代码单元中施加具有局部效果的限制。严格模式不会限制或修改必须在多个代码单元中一致运行的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标记的末尾进行垃圾回收,因为它没有指针/引用。