TL;DR:
No, a "use strict"
in one script
元素不强加"use strict"
关于其他中的代码script
元素。它仅适用于它所属的源文本。
(另外,重新script
问题末尾的标签:如果script
元素有一个src
,它所具有的任何内联文本都被视为“文档”并被忽略。)
Update:
现在规范中更清楚了(也许 ES5 中很清楚,但对我来说不是),是的,分开script
出于以下目的,元素是分开的"use strict"
。原始答案中的以下引用有略有改变 http://www.ecma-international.org/ecma-262/7.0/index.html#sec-strict-variant-of-ecmascript说“源文本”而不是“代码单元”,并且脚本和模块 http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-scripts-and-modules部分将进行更详细的介绍。
原答案:
规格 http://www.ecma-international.org/publications/standards/Ecma-262.htm says:
由于严格模式是在语法代码单元级别选择的,因此严格模式仅施加在此类代码单元内具有局部效果的限制。严格模式不会限制或修改必须跨多个代码单元一致运行的 ECMAScript 语义的任何方面。
(第 4.2.2 节)
所以问题是:不同script
标记不同的语法代码单元?
V8(Chrome 中的 JavaScript 引擎)似乎相信它们are分开,所以放一个"use strict";
在页面顶部的全局范围内将不起作用。也许它在我还没有找到的地方指定,但无论如何,这是一个合理的解释。
假设没有声明foo
没有显示,这段代码成为了牺牲品隐式全局变量的恐怖 http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html在正常模式下:
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>
...我得到了预期的异常(活生生的例子 http://jsbin.com/olomel/2)。如果我把它们分开script
不过,标签:
<script>
"use strict";
</script>
<script>
function test() {
try {
foo = "bar";
display("foo = " + foo);
}
catch (e) {
display("Exception: " + e);
}
}
</script>
I don't得到异常(在 V8 上)(example http://jsbin.com/olomel/3)。如果您考虑一下浏览器和 JavaScript 引擎如何交互,这是合理的。
同样,如果该函数在另一个文件中关闭,我会这样做:
<script>
"use strict";
</script>
<script src="/inatoq"></script>
我没有得到例外(example http://jsbin.com/olomel/1),大概是出于同样的原因。
请注意您的示例标签:
<script data-main="lib/main" src="lib/require.js">"use strict"</script>
是无效的。 Ascript
标签可能either have a src
属性or内容,但不是两者。 (嗯,基本上;细节here http://www.w3.org/TR/html5/scripting-1.html#the-script-element[HTML5] 和here http://www.w3.org/TR/html401/interact/scripts.html#edef-SCRIPT[HTML 4.01]。)如果它有src
元素,浏览器应该忽略内容,而且大多数浏览器都会忽略。最多。 :-)