TL;博士:
不,一个元素"use strict"
中的一个script
元素不会强加于"use strict"
其他script
元素中的代码。它仅适用于它所属的源文本。
(另外,重新script
标记问题末尾的标签:如果script
元素具有src
,则它具有的任何内联文本都被视为“文档”并被忽略。)
更新:
现在在规范中更清楚了(也许在 ES5 中很清楚,但对我来说不是)是的,单独script
的元素对于"use strict"
. 原始答案中的以下引用已略微更改为“源文本”而不是“代码单元”,并且脚本和模块部分更详细。
原始答案:
规范说:
因为严格模式是在句法代码单元级别选择的,所以严格模式只施加在这样的代码单元内具有局部影响的限制。严格模式不会限制或修改 ECMAScript 语义的任何必须跨多个代码单元一致操作的方面。
(第 4.2.2 节)
那么问题来了:不同的script
标签是不同的句法代码单元吗?
V8(Chrome 中的 JavaScript 引擎)似乎认为它们是独立的,因此在页面顶部放置一个"use strict";
全局范围内的单个是行不通的。也许它是在我还没有找到的地方指定的,但无论如何,这是一个合理的解释。
假设未显示任何声明,则此代码在正常模式下成为隐式全局恐怖的foo
牺牲品:
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>
...我得到了预期的异常(现场示例)。但是,如果我将它们放在单独的script
标签中:
<script>
"use strict";
</script>
<script>
function test() {
try {
foo = "bar";
display("foo = " + foo);
}
catch (e) {
display("Exception: " + e);
}
}
</script>
我没有得到异常(在 V8 上)(示例)。如果您考虑浏览器和 JavaScript 引擎是如何交互的,这是合理的。
同样,如果该功能在另一个文件中关闭,我会这样做:
<script>
"use strict";
</script>
<script src="/inatoq"></script>
我没有得到异常(example),大概是出于同样的原因。
请注意,您的示例标签在这里:
<script data-main="lib/main" src="lib/require.js">"use strict"</script>
是无效的。script
标签可能具有属性或内容,但不能同时具有两者。(嗯,基本上;细节在这里[HTML5] 和这里[HTML 4.01]。)如果它有一个元素,浏览器应该忽略内容,大多数人都会这样做。最多。:-)src
src