从cmc那看到的,分享给园友。以下是一个怪异的代码,谁放在面试题会很坑爹的,如下
a = { m: function() { this.n = function(x) { alert(x+2) } return 1 }, n: function(x) { alert(x+1) } } a.n(a.m())
定义一个对象a,有个方法m,n。n很简单参数x加1后打印。重点在m,它执行时会修改方法n,把x加2后打印。当执行a.n(a.m())是结果是什么呢,2还是3?
测试结果如下
IE6/7/8/Chrome23:3
IE9/10/Firefox/Safari/Opera: 2
说明在IE6/7/8/Chrome23中会先执行a.m(),此时a.n被改变了,因此输出的是3。IE9/10/Firefox/Safari/Opera则是先计算a.n(此时a.n尚未被修改),再计算参数a.m(),因此输出的是2。其实最后a.n都被修改了,如果在后面加一句alert(a.n)就能看见了。
代码可以简化一下
function m() { n = function(x) { alert(x+2) } return 1 } function n(x) { alert(x+1) } n(m())
这些浏览器谁遵循标准处理呢?查阅ecma262文档,到11.2.3章节, v3版本与v5版本 有2句话顺序是颠倒的:
v5:
...
2. Let func be GetValue(ref).
3. Let argList be the result of evaluating Arguments, producing an internal list of argument values (see 11.2.4).
...
v3:
...
2. Evaluate Arguments, producing an internal list of argument values (see 11.2.4).
3. Call GetValue(Result(1)).
...
只有Chrome没有遵循最新的ES5标准,IE的后续版本都遵循了。O(∩_∩)O~
相关推荐
在JavaScript的世界里,ES5(ECMAScript 5)是继ES3之后的一个重要版本,它引入了许多新的特性和改进,提升了JavaScript的性能和可维护性。然而,并非所有浏览器都完全支持ES5,特别是较早的版本。"es5-shim-master....
ESFive5 ES5-to-ES3编译器。 保持最新 获取更新: :
变量的作用域分为全局和局部,函数内部声明的变量为局部作用域,外部则为全局。数据类型包括基本类型(Undefined、Null、Boolean、Number、String)和引用类型(Object)。 ### 2. 字符串操作 ES3提供了丰富的字符...
未来 js 修复烦人的部分 关于 ES6 的演示文稿,向我们展示了在 ES3/ES5 中让我们烦恼的 JavaScript 部分,以及它们如何在该语言的较新版本中得到修复。 2014 年 12 月在伦敦举行
编译使用 ES6 计算属性编写的 JavaScript 以使用 ES5 或 ES3 兼容语法。 例如,这个: var propName = 'code' ; var params = { [ propName ] : true [ 'data' + propName . toUpperCase ( ) ] : true } ; ...
尽管后续有ES5、ES6(ES2015)、ES7(ES2016)等更新,但仍有项目使用ES3,尤其是在需要兼容较旧浏览器的情况下。 3. **前端开源库**:这类库通常是为了简化前端开发、提高代码质量或解决特定问题而创建的。它们...
Extendscriptr是NPM CLI模块,允许您在es3扩展脚本环境中使用es5和es6的许多现代javascript功能。 为什么 如果您习惯使用适当JavaScript环境,那么Adobe产品(主要用于After Effects,InDesign,Photoshop或...
扩展脚本-es5-shim 用于多附件Exendscript的ES5垫片的集合(对于es6垫片,请查看 )安装 npm init -ynpm install extendscript-es5-shim用法数组,字符串和函数注释所有的polyfills都可以在您的代码中使用。...
构建ES3,ES5和ES6的样本 只需在TypeScript-1.5.3中使用cd即可: $ tsc @ES3.params # or $ tsc @ES5.params # or $ tsc @ES6.params 然后运行: node Main.js # for ES3 and ES5 # or node Main-ES6.js # for ...
这本书比阮一峰老师那本《ES6入门》更深入,翻译质量也挺好的,值得一读。...Past versions: ES1, ES2, ES3, ES5, ES6 (also: ES2015), ES2016, ES2017 Current version: ES2018 Next version (in progress): ES2019
符合ES5规范的Array.prototype.reduceRight填充/填充/替换功能,其工作范围可追溯到ES3。 该软件包实现了接口。 它可以在ES3支持的环境中工作并符合。 因为Array.prototype.reduceRight取决于接收方(“ this”值...
let-er, Transpile非ES6允许块进入 ES6 ( 或者 ES3 ) ES6正在把 let x ="foo" JavaScript的语法,它基本上劫持任何 block 并将你的声明扩展到 block ( 而不是像ES5和 below 那样提升到包含函数) 。然而,有问题:ES6...
- 用于数组和对象的合并以及函数参数的传递。 9. **Proxy 和 Reflect** - 用于创建对象代理,实现数据的拦截和控制。 **二、ES6 兼容 ES5 的配置** 1. **Babel 转换器** - 使用 Babel 可以将 ES6 代码转换为 ...
ES3 和 ES5。 JavaScript 解释器或者“引擎”也有版本号,比如,Google 将它的 JavaScript 解释器叫做 V8,在撰写本书时 V8 引擎最新版本是 3.0。 JavaScript 语言核心针对文本、数组、日期和正则表达式的操作...
SheetJS是用于多种电子表格格式的解析器和编写器。通过官方规范、相关文档以及测试文件实现简洁的JS方法。SheetJS强调解析和编写的稳健,其跨格式的特点和统一的JS规范兼容,并且ES3/ES5浏览器向后兼容IE6
4. **函数**:函数是一等公民,可以作为参数传递和作为返回值。函数声明和函数表达式是两种不同的定义方式,后者可能引起立即调用函数表达式(IIFE)。 5. **对象**:对象是属性键值对的集合,键可以是字符串或符号...
1. 当转换八进制数时存在兼容性问题:ES3 将 "070" 视为八进制,但 ES5 不支持前导零,因此将其视为十进制。 2. `parseInt()` 首先尝试将参数转换为字符串,然后再进行整数转换。 #### 二、位操作符 JavaScript中...
js-xlsx, SheetJS Community Edition电子表格分析器和编写器 js js各种电子表格格式的分析器和编写器。...跨格式特征兼容性和统一的JS表示,以及 es3/es5浏览器兼容性回到 IE6.这是社区版本。 我们还提供了一个专
Summary 暂时我就想到3个方法而已。如果读者想到其他好用方法,也可以交流一下 parseInt 位运算符 Math.floor Math.ceil ...parseInt(070)//ES3和ES5都为56 parseInt(22.5)//22 2. 转换规则: (1). 根据实例(1)
es-shim APIAPI合约对于任何给定的“ es-shim API”兼容软件包foo ,必须包含以下不变量: 该软件包将在支持可实现规范语义的最旧JS版本的环境中运行-ES3,ES5和/或ES6。 程序包应在其自述文件中指出其最低级别的所...