TL;DR:
不,一个script 元素中的"use strict" 不会将"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);
}
}
在正常模式下,它会创建一个新的全局变量foo,其值为“bar”并显示"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 标签可能任一具有src属性或内容,但不能两者兼有。 (嗯,基本上;细节here [HTML5] 和here [HTML 4.01]。)如果它有一个src 元素,浏览器应该忽略内容,大多数人都会这样做。最多。 :-)