ECMAScript5 中严格模式编译指示的范围是什么?

"use strict";

我想这样做(主要是因为 JSLint 不会抱怨它):

"use strict";

(function () {
  // my stuff here...
}());

但我不确定这是否会破坏其他代码。我知道我可以做到这一点,这会将编译指示的范围限制到函数......

(function () {

  "use strict";

  // my stuff here...

}());

但 JSLint 对此有所抱怨(当启用“strict”JSLint 选项时),因为它认为您在启用“use strict”之前正在执行代码。

这是我的问题。如果我有 fileA.js:

"use strict";
// do some stuff

和文件B.js:

eval( somecodesnippet ); // disallowed by "use strict"

然后以相同的顺序将它们包含在我的 html 页面中,pragma 的范围是否会限定在文件中,或者 pragma 是否会渗透到 fileB 中,从而阻止 eval 执行?

有帮助吗?

解决方案

编辑 看来我错了。请参见 杰夫·沃尔登的回答如下.

查看相关问题的答案: JavaScript 中的“use strict”有什么作用,其背后的原因是什么?

尽管 JSLint 有抱怨,但您可以(并且 应该) 使用 "use strict"; 如果您只希望该函数处于严格模式,则可以在函数内部。如果您在全局上下文中使用它,那么它将强制您的所有代码处于严格模式。 简短回答: 是的,它会阻止您使用 eval.

其他提示

"use strict"只适用于功能或程序的范围。所以,如果你有在顶部"use strict" fileA.js,严格模式fileA.js执行,并在其定义的所有功能都做同样的调用时。但是fileB.js是一个独立的程序,所以从fileA.js的"use strict"并不适用于它 - 因此fileB.js将在非严格模式下执行。 (当然,如果somecodesnippet"use strict"指令,并开始解析正确,该代码将在严格模式下执行,并通过代码定义的功能也将这样做。)严绝对不会“流血” - 每ES5 4.2.2(诚然非规范,但是我确信我可以挖此如果需要的话)的标准参考文献,“实现方式必须支持无限制和严格模式代码单元的组合成一个单一的复合节目”。

这有一个问题:如果你在全球范围内使用严格模式有时但并非总是如此,你不能再串连脚本到一个文件中。假设你有一个脚本,B,C,按顺序d。如果A是严格的,整体拼接将以严格的,即使B / C / d没有!反之,如果A是不严格(和非空),整体级联将是不严格的,即使B / C / d分别为严格。这已经咬至少一个早期采用站点那里。

所有这一切说,严格的模式并不禁止eval。当eval被称为正常的方式严格模式,使用形式eval(code [, ...])的程序语法,这是一个“直接” EVAL其行为的eval方式总是有 - 除了code作为严格模式的代码始终评估,即使code没有按”牛逼开始与"use strict"指令,并且不同的是用代码创建的任何变量保存在自己的独立存储任何现有的变量。 (确切的语义是有点复杂;对Firefox的JavaScript引擎,我的工作,后期实现这个东西,即使在规格和它仍然不是直观的给我一个实现工作的时间相当数量)

如果它不叫这样 - eval.call(...)setTimeout(eval, ...)setInterval(eval, ...)var ev = eval; ev(...);,等等 - 这是一个 “间接” EVAL。间接的eval(内部或外部严格的模式是否)的行为方式略有不同:名称解析和变量定义发生,就好像在全球范围内。 (该代码将执行作为仅当它开始于一个"use strict"指令严格模式的代码。)

严格模式支持几乎 - 但不完全 - 完成了最新的火狐的Nightlies版,所以它可能是值得下载一个与实施的严格模式的部分打转转。我还是要说推迟生产使用,直到它的完整,但它绝对准备好实验(只要你理解严格模式没有完全还)。 (至于肖恩·麦克米兰的链接,要知道,它的“支持”索赔代表最少需要每发子弹的功能极致。严格的模式测试是好多了,但可以肯定他们是无处接近完全覆盖严格模式。 )

eval( somecodesnippet ); // disallowed by "use strict"

若您somecodesnippet之前声明。

  

VAR somecodesnippet = “这里你真棒codesnippet”;

     

的eval(somecodesnippet); // NOT通过不允许 “使用严格的”

在整个文件:

<script...>
  "use strict";

在整个功能和它的嵌入式功能 例如:

function fn(){
  "use strict";
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top