严格模式编译指示在ECMAScript5中有什么范围?
"use strict";
我想这样做(主要是因为JSLint没有抱怨它):
"use strict";
(function () {
// my stuff here...
}());
但我不确定这是否会破坏其他代码。我知道我可以做到这一点,这将把pragma的范围扩展到函数...
(function () {
"use strict";
// my stuff here...
}());
但JSLint抱怨它(当启用“严格”JSLint选项时),因为它认为您在启用“use strict”之前正在执行代码。
这是我的问题。如果我有fileA.js:
"use strict";
// do some stuff
和fileB.js:
eval( somecodesnippet ); // disallowed by "use strict"
然后按照相同的顺序将它们包含在我的html页面中,将pragma限定为文件,还是将pragma放到fileB中,从而阻止eval执行?
答案 0 :(得分:55)
"use strict"
仅适用于函数或程序范围。因此,如果顶部有"use strict"
的fileA.js,则fileA.js在严格模式下执行,并且在调用时,其中定义的所有函数都将执行相同的操作。但fileB.js是一个单独的程序,因此fileA.js中的"use strict"
不适用于它 - 因此fileB.js将以非严格模式执行。 (当然,如果somecodesnippet
以"use strict"
指令开头并正确解析,那么该代码将以严格模式执行,并且该代码定义的函数也会这样做。)严格性绝对不会“流血” - - 并且根据ES5 4.2.2(诚然,非规范,但我确信如果有必要,我可以为此挖掘规范性参考),“实现必须支持将无限制和严格模式代码单元组合成单个复合程序”
有一个问题:如果你有时但不总是在全局范围内使用严格模式,那么你就不能再将脚本连接成一个文件了。假设您按顺序拥有脚本A,B,C,D。如果A是严格的,整体连接将是严格的,即使B / C / D不是!相反,如果A不严格(并且非空),即使B / C / D严格,整体级联也将是非严格的。这已经咬过至少一个早期采用者网站了。
所有这一切,严格模式并不禁止eval
。当eval
在严格模式下被称为正常方式时,使用eval(code [, ...])
形式的程序语法,它是一个“直接”eval,其行为方式eval
始终具有 - 除了{{ 1}}总是被评估为严格模式代码,即使code
不是以code
指令开头,并且代码创建的任何变量都保存在它们自己的独立存储中变量。 (确切的语义有点复杂;我使用Firefox的JavaScript引擎,最近实现这些东西,即使在规范中花费了相当多的时间并且正在实现它,但对我来说仍然不直观。)
如果没有这种方式调用 - "use strict"
,eval.call(...)
,setTimeout(eval, ...)
,setInterval(eval, ...)
等等 - 这是一个“间接”评估。间接eval(无论是在严格模式内部还是外部)的行为略有不同:名称解析和变量定义就像在全局范围内一样。 (只有当代码以var ev = eval; ev(...);
指令开头时,代码才会作为严格模式代码执行。)
严格模式支持几乎 - 但不是完全 - 在最新的Firefox nightlies中完成,因此可能值得下载一个来实现严格模式的那些部分。我还是说在生产使用完成之前暂停生产,但它确实已准备好进行实验(只要您了解严格模式尚未完全实现)。 (至于Sean McMillan的链接,请注意它的“支持”声称代表了每个子弹所需功能的极端最低限度。严格的模式测试要好得多,尽管可以肯定他们完全没有接近严格的模式。 )
答案 1 :(得分:3)
编辑看来我错了。请参阅Jeff Walden's answer below。
查看相关问题的答案:What does "use strict" do in JavaScript, and what is the reasoning behind it?
尽管有JSLint的抱怨,如果您只希望该函数处于严格模式,您可以(并且 )在函数内部使用"use strict";
。如果在全局上下文中使用它,那么它将强制所有代码处于严格模式。 简短回答:是的,它会阻止您使用eval
。
答案 2 :(得分:0)
eval( somecodesnippet ); // disallowed by "use strict"
如果你之前声明了somecodesnippet,那就不行了。
var somecodesnippet =“你真棒的代码片段”;
eval(somecodesnippet); //“禁止使用严格”
答案 3 :(得分:0)
整个文件:
<script...>
"use strict";
或
整个功能及其嵌入功能 例如:
function fn(){
"use strict";