因此 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 null
thisArg 被替换为全局对象,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,以及调用者提供的参数列表:
- 如果函数代码是严格代码,则将ThisBinding设置为thisArg.
- Else if thisArg is null or 不明确的,设置ThisBinding
到全局对象。
- ...
ES3 指定调用者负责用全局对象替换 null 或未定义的 this 值。 ES5 指定被调用者具有该责任(如果它不是严格模式函数)。对于非严格代码,这不是可观察到的差异。仅当被调用者是严格函数时,规范更改才会产生影响。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)