如何确保ES3程序能够在ES5引擎中运行?

2024-04-27

因此 ECMAScript 5 引入了与 ECMAScript 3 的一些不兼容性。


Example:

Many https://developer.mozilla.org/en/JavaScript/Strict_mode articles http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/已写明this === null || this === undefined是可能的在 ES5 严格模式下:

"use strict";
(function () {
    alert(this); // null
}).call(null);

但是,什么标准 http://www.ecma-international.org/publications/standards/Ecma-262.htm really表明 ES5 引擎也允许这样做在非严格模式下:

15.3.4.3 ... thisArg 值不加修改地传递为this价值。这是对第 3 版的更改,其中undefined or nullthisArg 被替换为全局对象,ToObject 被应用于所有其他值,并且该结果作为this value.

目前,IE9 是唯一真正以这种方式实现 ES5 的浏览器,事实证明这可能中断当前脚本 https://mail.mozilla.org/pipermail/es5-discuss/2010-June/003581.html. Great.


附件EES5 spec http://www.ecma-international.org/publications/standards/Ecma-262.htm列出了许多其他不兼容性。

那么,确保我们久经考验的 ES3 脚本能够继续完美运行的最佳方法是什么?某种自动化测试套件?我们必须手动测试这一切吗?


根据记录,提问者对 ES5 15.3.4.3 的解释是不正确的。 ES5 中对非严格函数的任何调用都应该与 ES3 中的明显相同。全局对象仍会传递到任何使用 null 或 undefined 作为 this 值调用的非严格函数。

分析中缺少的部分是 10.4.3“输入功能代码”:

当控制进入执行时执行以下步骤 函数对象中包含的函数代码的上下文F, 来电者 假如thisArg,以及调用者提供的参数列表:

  1. 如果函数代码是严格代码,则将ThisBinding设置为thisArg.
  2. Else if thisArg is null or 不明确的,设置ThisBinding 到全局对象。
  3. ...

ES3 指定调用者负责用全局对象替换 null 或未定义的 this 值。 ES5 指定被调用者具有该责任(如果它不是严格模式函数)。对于非严格代码,这不是可观察到的差异。仅当被调用者是严格函数时,规范更改才会产生影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确保ES3程序能够在ES5引擎中运行? 的相关文章

随机推荐