- 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/
我有以下对象: dog = { location: { x: 52.1089, y: 16.2323 }, f: function(message) { alert
在 TSQL 中,如果我要搜索有效的 .com 电子邮件地址,我需要确保有一个 @ 符号,它以 .com 结尾,并且在 @ 前后至少有一个字符。 SELECT * FROM CUSTOMER WHER
我正在尝试准备一个信用卡交易列表,以便在 Excel 2010 中进行透视和进一步分析(满足个人需求)。问题是我的银行机构没有遵循标准的日期格式,所以有时日期会显示为 Jun. 1, 2013 , 有
看来您不能在 riak 中进行交易。如何确保数据正确? 假设我们要插入评论。在 redis 我会做 commentId=incr commentCount multi SET comment_post
对于下面给定的模式,是否可以确保至少一个属性包含一个值(即 minLength 为 1): { "$schema": "http://json-schema.org/draft-04/sche
我计划在 Haxe 的一个子集中编写 Haxe 库,这些库将编译为每种 Haxe 目标语言。有什么方法可以验证 Haxe 程序是否可以编译为所有目标语言,是否可以在不手动测试每个目标平台上的编译代码的
如果浏览器窗口未聚焦,则当前页面上的所有 webdriver 标识都失败。 如何使用 webdriver 使浏览器成为焦点? 最佳答案 ((JavascriptExecutor) webDriver)
我从这样的 HTML GET 请求中获取图像链接... www.example.com?image=www.anotherdomain.com/image.jpg if (isset($_GET['i
我有一个 eunit 测试,它生成一个唯一的节点名称并开始分发: {A,B,C} = now(), Nodename = list_to_atom(lists:flatten(io_lib:forma
我正在完成我的 iPhone 应用程序。我只是担心我们的网络服务器级别的安全性。数据通过网络服务被传送到 iPhone 应用程序。 我可以在网络服务上采取哪些安全措施,以免受到攻击? 谢谢 最佳答案
我正在编写一个应用程序,该应用程序启动一个运行简单 Web 服务器的子进程。我正在使用 NSTask 并通过管道与其进行通信,一切看起来或多或少都很好。但是,如果我的程序崩溃,子进程将保持事件状态,并
我有一些应用程序,我调用 ShowMessage('Complete!');在长时间操作结束时。 大多数时候,这效果很好,但每隔一段时间,消息对话框就会显示在主窗体后面。 有什么方法可以确保 Show
我通过将消息插入集合并让模板使用 {{#each}} 打印出集合来创建一个简单的聊天。 我不太熟悉安全性,但是有没有办法让它符合 EFF 规定? https://www.eff.org/secure-
我有一个商店,我想在其中正确管理 id。假设我有以下帖子存储: type Post = { id: number; title: string; body?: string; } type
我有一个使用 ajax post 方法和数据表的程序。经过几周的摆弄,我确定我根本不明白 javascript 是如何工作的。这是我的 JavaScript: $('#SaveTimeSheet').
我有一个系统,如果从 Azure 服务总线丢失消息将是一场灾难,也就是说,数据将永远丢失,并且没有实际方法可以在不造成重大中断的情况下修复损坏。 在这种情况下我可以完全依赖 ASB 吗? (即使它
如何确保 scalatest 测试不会并行运行?在 0.12 之前,我有一个 sbt 设置: parallelExecution in Test := false 新版本引入了一些复杂的机制。这种更简
我的端点有两个如下所示的 promise : request.post({ url: url, json: smsSTART, header
简短版本 当 ui-router 转换到新 View 时(以我不完全理解的方式使用 ngAnimate),它会添加类 ng-leave 和 ng-leave-active 到当前 View 。它还将类
目前正在努力寻找验证 2 个表的方法(有效地验证表 A 的大量行) 我有两张 table 表A ID A B C 表格匹配 ID Number A 1 A 2 A 9 B 1
我是一名优秀的程序员,十分优秀!