从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~
相关推荐
ESFive5 ES5-to-ES3编译器。 保持最新 获取更新: :
未来 js 修复烦人的部分 关于 ES6 的演示文稿,向我们展示了在 ES3/ES5 中让我们烦恼的 JavaScript 部分,以及它们如何在该语言的较新版本中得到修复。 2014 年 12 月在伦敦举行
编译使用 ES6 计算属性编写的 JavaScript 以使用 ES5 或 ES3 兼容语法。 例如,这个: var propName = 'code' ; var params = { [ propName ] : true [ 'data' + propName . toUpperCase ( ) ] : true } ; ...
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...
SheetJS是用于多种电子表格格式的解析器和编写器。通过官方规范、相关文档以及测试文件实现简洁的JS方法。SheetJS强调解析和编写的稳健,其跨格式的特点和统一的JS规范兼容,并且ES3/ES5浏览器向后兼容IE6
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。 程序包应在其自述文件中指出其最低级别的所...
A、必须选择ECMAScript target version ES3或ES5,选择ES6版本太高,生成的js文件会有class关键字 B、eclipse设置默认.ts文件格式是TypeScript Window--->General-Editor--->File Associatior-->*.ts选择默认...
ES6中定义类的方式, 就是ES3和ES5中定义类的语法糖,虽然也有些区别,但是整体定义类的方式更加简洁,类的继承更加方便, 如果想对ES6中的继承更加熟悉, 最好了解ES5中原型继承的方式, 博客园中说JS继承的文章很...
object.getprototypeof ES5符合大多数规范的Object.getPrototypeOf sham / polyfill / Object.getPrototypeOf ,可在尽可能多的引擎中使用-特别是支持__proto__或ES6的任何引擎。 内置类型也可以在较旧的引擎中正常...
两种用法:全局严格模式局部函数内严格模式(推荐)严格模式和ES3模式的区别改变作用域链的最顶端(将obj作为此代码块的作用域最顶端,通常配合命名空间使用)} /
ES3、ES5 还是 ES6/7? ES5 因为 缺失块:模块系统 老套 无模块 导出到全局上下文 宣言 : var aja = { awesome : function ( ) { console . log ( 'awesome' ) ; } } ; window . aja = window . aja || aja ...
图文并茂介绍如何使用自由天空ES3封装XP过程 适合有过封装经验的 新手可以下载下来参考参考
callback是在数组中作为参数传递的callback函数。 用于处理数组的下一个元素。 ES3 / ES5标准 var arr = [ 'яблоко' , 'груша' , 'колбаса' ] arr . forEach ( function ( element ) { console ...