`
zhouyrt
  • 浏览: 1161985 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ES3和ES5关于计算顺序的问题(ES5先计算函数ES3则是参数)

阅读更多

 

从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~

 

 

 

 
分享到:
评论

相关推荐

    es5-shim-master.zip

    在JavaScript的世界里,ES5(ECMAScript 5)是继ES3之后的一个重要版本,它引入了许多新的特性和改进,提升了JavaScript的性能和可维护性。然而,并非所有浏览器都完全支持ES5,特别是较早的版本。"es5-shim-master....

    esfive:ES5-to-ES3编译器

    ESFive5 ES5-to-ES3编译器。 保持最新 获取更新: :

    ES3.zip

    变量的作用域分为全局和局部,函数内部声明的变量为局部作用域,外部则为全局。数据类型包括基本类型(Undefined、Null、Boolean、Number、String)和引用类型(Object)。 ### 2. 字符串操作 ES3提供了丰富的字符...

    future-js-fixing-the-annoying-parts:关于 ES6 的演示,展示了 ES3ES5 中让我们烦恼的 JavaScript 部分以及它们如何在新版本的语言中修复

    未来 js 修复烦人的部分 关于 ES6 的演示文稿,向我们展示了在 ES3/ES5 中让我们烦恼的 JavaScript 部分,以及它们如何在该语言的较新版本中得到修复。 2014 年 12 月在伦敦举行

    es6-computed-properties:ES6 计算属性编译为 ES5ES3

    编译使用 ES6 计算属性编写的 JavaScript 以使用 ES5 或 ES3 兼容语法。 例如,这个: var propName = 'code' ; var params = { [ propName ] : true [ 'data' + propName . toUpperCase ( ) ] : true } ; ...

    前端开源库-eslint-config-medikoo-es3.zip

    尽管后续有ES5、ES6(ES2015)、ES7(ES2016)等更新,但仍有项目使用ES3,尤其是在需要兼容较旧浏览器的情况下。 3. **前端开源库**:这类库通常是为了简化前端开发、提高代码质量或解决特定问题而创建的。它们...

    extendscriptr:NPM命令行工具,用于将现代javascript(es5和es6)编译为可执行扩展脚本(es3)

    Extendscriptr是NPM CLI模块,允许您在es3扩展脚本环境中使用es5和es6的许多现代javascript功能。 为什么 如果您习惯使用适当JavaScript环境,那么Adobe产品(主要用于After Effects,InDesign,Photoshop或...

    extendscript-es5-shim:ES5填充垫片的集合Exendscript

    扩展脚本-es5-shim 用于多附件Exendscript的ES5垫片的集合(对于es6垫片,请查看 )安装 npm init -ynpm install extendscript-es5-shim用法数组,字符串和函数注释所有的polyfills都可以在您的代码中使用。...

    TypeScriptNPMPublish:在NPM上发布TypeScript项目变得容易!

    构建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 ...

    Exploring ES6(中文版)

    这本书比阮一峰老师那本《ES6入门》更深入,翻译质量也挺好的,值得一读。...Past versions: ES1, ES2, ES3, ES5, ES6 (also: ES2015), ES2016, ES2017 Current version: ES2018 Next version (in progress): ES2019

    Array.prototype.reduceRight:符合ES5规范的“ Array.prototype.reduceRight” shimpolyfillreplacement可以使用到ES3

    符合ES5规范的Array.prototype.reduceRight填充/填充/替换功能,其工作范围可追溯到ES3。 该软件包实现了接口。 它可以在ES3支持的环境中工作并符合。 因为Array.prototype.reduceRight取决于接收方(“ this”值...

    let-er, Transpile非ES6允许块进入 ES6 ( 或者 ES3 ).zip

    let-er, Transpile非ES6允许块进入 ES6 ( 或者 ES3 ) ES6正在把 let x ="foo" JavaScript的语法,它基本上劫持任何 block 并将你的声明扩展到 block ( 而不是像ES5和 below 那样提升到包含函数) 。然而,有问题:ES6...

    ES6 手把手教你环境配置与介绍(兼容ES5)

    - 用于数组和对象的合并以及函数参数的传递。 9. **Proxy 和 Reflect** - 用于创建对象代理,实现数据的拦截和控制。 **二、ES6 兼容 ES5 的配置** 1. **Babel 转换器** - 使用 Babel 可以将 ES6 代码转换为 ...

    JavaScript 技术的现状与前景.pdf

    ES3 和 ES5。 JavaScript 解释器或者“引擎”也有版本号,比如,Google 将它的 JavaScript 解释器叫做 V8,在撰写本书时 V8 引擎最新版本是 3.0。 JavaScript 语言核心针对文本、数组、日期和正则表达式的操作...

    SheetJS脚本库-前端导出excel表格

    SheetJS是用于多种电子表格格式的解析器和编写器。通过官方规范、相关文档以及测试文件实现简洁的JS方法。SheetJS强调解析和编写的稳健,其跨格式的特点和统一的JS规范兼容,并且ES3/ES5浏览器向后兼容IE6

    ECMAScript规范-第三版_中文版.

    4. **函数**:函数是一等公民,可以作为参数传递和作为返回值。函数声明和函数表达式是两种不同的定义方式,后者可能引起立即调用函数表达式(IIFE)。 5. **对象**:对象是属性键值对的集合,键可以是字符串或符号...

    javascript将浮点数转换成整数的三个方法.docx

    1. 当转换八进制数时存在兼容性问题:ES3 将 "070" 视为八进制,但 ES5 不支持前导零,因此将其视为十进制。 2. `parseInt()` 首先尝试将参数转换为字符串,然后再进行整数转换。 #### 二、位操作符 JavaScript中...

    js-xlsx, SheetJS Community Edition电子表格分析器和编写器.zip

    js-xlsx, SheetJS Community Edition电子表格分析器和编写器 js js各种电子表格格式的分析器和编写器。...跨格式特征兼容性和统一的JS表示,以及 es3/es5浏览器兼容性回到 IE6.这是社区版本。 我们还提供了一个专

    javascript将浮点数转换成整数的三个方法

    Summary 暂时我就想到3个方法而已。如果读者想到其他好用方法,也可以交流一下 parseInt 位运算符 Math.floor Math.ceil ...parseInt(070)//ES3和ES5都为56 parseInt(22.5)//22 2. 转换规则: (1). 根据实例(1)

    es-shim-api:API合约和基本测试,适用于符合* es-shim API *的模块

    es-shim APIAPI合约对于任何给定的“ es-shim API”兼容软件包foo ,必须包含以下不变量: 该软件包将在支持可实现规范语义的最旧JS版本的环境中运行-ES3,ES5和/或ES6。 程序包应在其自述文件中指出其最低级别的所...

Global site tag (gtag.js) - Google Analytics