在ECMAScript5中,“使用严格”的范围是什么?

时间:2010-02-26 17:43:49

标签: javascript scope ecma262 strict ecmascript-5

严格模式编译指示在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执行?

4 个答案:

答案 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";