繁体   English   中英

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

[英]In ECMAScript5, what's the scope of “use strict”?

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

"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总是一样 - 除了code总是被评估为严格模式代码,即使code不以"use strict"指令开头,并且代码创建的任何变量都保存在与任何现有变量不同的存储中。 (确切的语义有点复杂;我使用Firefox的JavaScript引擎,最近实现这些东西,即使在规范中花费了相当多的时间并且正在进行实现,对我来说仍然不直观。)

如果没有这样调用 - eval.call(...)setTimeout(eval, ...)setInterval(eval, ...)var ev = eval; ev(...); var ev = eval; ev(...); 等等 - 这是一个“间接”评估。 间接eval(无论是在严格模式内部还是外部)的行为略有不同:名称解析和变量定义就像在全局范围内一样。 (只有当代码以"use strict"指令开头时,代码才会作为严格模式代码执行。)

严格的模式支持几乎 - 但不是完全 - 在最新的Firefox nightlies中完成 ,因此可能值得下载一个来实现严格模式的那些部分。 我还是说在生产使用完成之前暂停生产,但它确实已准备好进行实验(只要您了解严格模式尚未完全实现)。 (至于Sean McMillan的链接,请注意它的“支持”声称代表了每个子弹所需功能的极端最低限度。严格的模式测试要好得多,尽管可以肯定他们完全没有接近严格的模式。 )

编辑看来我错了。 请参阅下面的Jeff Walden的回答

看看这个相关问题的答案: JavaScript中“use strict”是做什么的,背后的原因是什么?

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

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

如果您之前声明somecodesnippet,则不会。

var somecodesnippet =“你真棒的代码片段”;

eval(somecodesnippet); //“禁止使用严格”

整个文件:

<script...>
  "use strict";

要么

整个函数及其嵌入函数例如:

function fn(){
  "use strict";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM