- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在启动一个新的 javascript 应用程序并且想使用严格模式。但是,我们仍然需要支持一些不支持严格模式的旧浏览器(IE8、9)。我的一些同事担心严格模式带来的运行时语义变化——他们担心严格函数在旧浏览器上以松散模式运行时会有不同的行为。
是否有一组额外的限制我可以添加以确保函数在松散模式下具有与严格模式相同的运行时语义?具体来说,我想要一组我可以检查的规则自动化的、类似 lint 的工具。我的第一个想法是防止人们使用 eval
或 arguments
。这样就够了吗?
使用 coffeescript 编码是否有助于实现这一目标?
例如,考虑以下函数:
(function(){
'use strict';
function foo(bar) {
arguments[0] = 'You are in lax mode';
alert(bar);
}
foo('You are in strict mode');
})();
这个函数在严格模式下运行正常,但在松散模式下有不同的行为。我正在寻找一套规则来确保人们不会不小心这样做。
最佳答案
Annex C 中总结了所有严格模式的功能ECMAScript 规范。在大多数情况下,当您尝试使用不允许的功能(新的保留字、八进制文字和转义序列、对象文字中同一属性的多个定义等)时,严格模式会抛出错误。我知道你的问题是关于不会抛出任何错误的情况,所以它们是:
Arguments objects for strict mode functions do not dynamically share their array indexed property values with the corresponding formal parameter bindings of their functions. (10.6).
For strict mode functions, if an arguments object is created the binding of the local identifier arguments to the arguments object is immutable and hence may not be the target of an assignment expression. (10.5).
这会导致您所举示例中出现的问题。如果您完全禁止使用 arguments
,那么这里不会有任何问题。我个人认为禁止使用 arguments
过于激进,但这是你的决定。
- Strict mode eval code cannot instantiate variables or functions in the variable environment of the caller to eval. Instead, a new variable environment is created and that environment is used for declaration binding instantiation for the eval code (10.4.2).
你也不允许 eval
,所以你在这里也很好。
If
this
is evaluated within strict mode code, then thethis
value is not coerced to an object. Athis
value ofnull
orundefined
is not converted to the global object and primitive values are not converted to wrapper objects. Thethis
value passed via a function call (including calls made usingFunction.prototype.apply
andFunction.prototype.call
) do not coerce the passed this value to an object (10.4.3, 11.1.1, 15.3.4.3, 15.3.4.4).
这意味着两件事:
this
在未定义的情况下不会被强制转换为全局对象,因此:
//"use strict";
function foo() {
console.log(this);
}
foo();
// logs undefined in strict mode, and window in classic mode
我不认为这个可以用静态分析来捕获。根据您要对 this
执行的操作,它可能会在严格模式下导致错误。例如,函数 this.foo = 'bar'
将在经典模式下创建一个全局变量,但在经典模式下引发 TypeError。但是 typeof this
不会抛出任何错误,只会产生不同的结果。
this
在设置为原始值时不会被强制转换为包装器对象。例如:
//"use strict";
function valtype() { return typeof this }
console.log(valtype.call("foo"));
// logs "string" in strict mode and "object" in classic mode
这听起来没什么大不了的,但可能会引起问题。我也认为静态分析无法检测到这一点。
底线:为此施加限制并创建 lint 工具可能不是最佳解决方案。这甚至可能是不可能的。为什么不创建一组单元测试呢?
关于javascript - 如何确保代码在严格模式和松散模式下以相同的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176637/
我正在尝试在松散的 XAML 中使用 ResourceDictionary 并将其加载到运行时以向 WPF 应用程序提供模板和样式。我在本地目录中有可用的 XAML,并在应用启动时使用 URI 将新的
我正在尝试在松散的 XAML 中使用 ResourceDictionary 并将其加载到运行时以向 WPF 应用程序提供模板和样式。我在本地目录中提供了 XAML,并在应用程序启动时使用 URI 将新
下面这段代码会导致内存丢失,因为rA在构造时被初始化为无效。我什么时候可以解决这个问题? 使用 shared_ptr 还是希望 future 的编译器版本能够捕获这些错误代码? #include u
我有一个可扩展的UITableView,具有特定的单元格、页眉和页脚高度。当用户点击标题时,单元格开始显示在其下方(部分展开)。当用户再次点击时,部分会折叠。 我的问题是,当用户点击标题时,标题变为绿
我看过这个问题,没看出问题出在哪里。我不是 C++ 专家,所以对我来说这看起来还不错。我上次尝试时,这曾经毫无问题地编译。 namespace yaaf { /********************
问题陈述如下,假设你有一个包含三个元素的标题: ... ... ... Logo 和选项的绝对宽度分别为 220px 和 294px。元素布局安排是: .logo { float:left; } .s
我是一名优秀的程序员,十分优秀!