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

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

"use strict"; 

我想这样做(主要是因为JSLint没有抱怨):

 "use strict"; (function () { // my stuff here... }()); 

但我不确定是否会破坏其他代码。 我知道,我可以做到这一点,这将编译范围的function…

 (function () { "use strict"; // my stuff here... }()); 

但JSLint抱怨(当“strict”JSLint选项被启用时),因为它认为你在启用“use strict”之前执行的代码。

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

 "use strict"; // do some stuff 

和fileB.js:

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

然后按照相同的顺序将它们包含在我的html页面中,这个编译指示是否会被限制到文件中,或者这个编译指示是否会stream入到fileB中,从而阻止了eval的执行?

编辑看来我是不正确的。 请看下面的Jeff Walden的答案 。

查看相关问题的这个答案: JavaScript中使用“严格使用”是什么,它背后的原因是什么?

尽pipeJSLint的投诉,你可以(也应该 )使用"use strict"; 如果你只希望那个函数处于严格模式,那么在函数内部。 如果你在全局环境中使用它,那么它将强制所有的代码处于严格模式。 简单的回答:是的,它会阻止你使用eval

"use strict"仅适用于function或程序范围。 所以如果你在顶部有"use strict"的fileA.js文件,fileA.js将以严格的模式执行,而且所有在其中定义的函数在调用的时候都是一样的。 但fileB.js是一个单独的程序,所以fileA.js中的"use strict"不适用于它,因此fileB.js将以非严格模式执行。 (当然,如果somecodesnippet"use strict"指令开始并正确parsing,那么代码将以严格模式执行,并且由该代码定义的函数也会这样做)。严格性绝对不会“stream血” – 并且按照ES5 4.2 .2(当然,这是非规范性的,但是我相信如果需要的话,我可以为此做一个规范性的参考),“一个实现必须支持将不受限制和严格的模式代码单元组合到一个复合程序中”。

其中一个问题是:如果您在全局范围内使用严格模式,但并非总是如此,则不能再将脚本连接成单个文件。 假设你有脚本A,B,C,D的顺序。 如果A是严格的,那么即使B / C / D不是,整体级联也是严格的。 相反,如果A不严格(且非空),即使B / C / D严格,整体级联也不是严格的。 这已经让至less一个早期采用者的网站陷入困境。

所有这一切,严格模式并不禁止eval 。 当在严格模式下eval被称为正常方式时,使用eval(code [, ...])forms的程序语法eval(code [, ...]) ,这是一个“直接的”eval,其行为是eval总是具有的方式 – 除了code总是被评估为严格的模式代码,即使code不是以"use strict"指令开始的,除了由代码创build的任何variables都保存在它们自己的独立存储中而不是任何现有的variables。 (确切的语义有些复杂,我在Firefox的JavaScript引擎上工作,后来实现这个东西,甚至在规范中花费了相当长的时间,并且在一个实现上工作,但对我来说还是不直观的。)

如果没有这样调用eval.call(...)setTimeout(eval, ...)setInterval(eval, ...)var ev = eval; ev(...); var ev = eval; ev(...); 等等 – 这是一个“间接”评估。 间接评估(无论是内部还是外部严格模式)的行为有点不同:名称parsing和variables定义在全局范围内发生。 (只有以"use strict"指令开始,代码才会作为严格模式代码执行。)

严格的模式支持几乎 – 但不是完全的 – 在最新的Firefox夜晚完成 ,所以它可能是值得下载一个玩的严格模式的部分实施。 我仍然认为,在生产使用完成之前,我们还是坚持下去,但是它绝对可以做实验(只要你明白严格模式还没有完全实现)。 (至于Sean McMillan的链接,请注意,它的“支持”声明代表了每个子弹所需function的极端最低限度。严格模式testing要好得多,尽pipe要确保它们完全不能覆盖严格的模式。 )

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

不,如果你之前申报somecodesnippet。

var somecodesnippet =“你的真棒codesnippet在这里”;

eval(somecodesnippet); //不要被“严格使用”