ECMA-262是ECMAScript5.1的规范。

规范文档描述了ECMAScript的原理、相关定义、规则、标准。

要精通javascript,必须要能够读懂该规范的对应内容。

与《你不知道的javascript上》、《你不知道的javascript中》、《javascript高级程序设计》、《javascript权威指南》对比之后发现,所有的这些书籍,讲的都不太对,都有问题,都不能引入正确的理解。它们在某种程度上能让我们解决遇到的一些问题,但是始终不是描述本质,当遇到更深入的问题时,就没办法了。

所以最终只能到ECMA-262上寻求答案。

但是该规范描述非常抽象、笼统,非常难于理解。

所以,需要加上一些更具体的理解。

比如、全局词法环境的环境记录是 声明式记录项还是对象式记录项?规范中没有明说。

比如、词法环境和变量环境一开始是同一个词法环境对象,那什么时候不是同一个词法环境,这个时候他们各自又是什么?

更具体的,为什么在全局执行环境下的代码,var hello = ‘kitty’;console.info(this.hello);会输出kitty?

为什么在全局执行环境下的代码,this.foo = ‘bar’;console.info(foo);会输出bar?

能否在非全局执行环境实现这样的效果?

以下,就是本人根据规范、网上博客以及个人理解得出来的一下结论:

全局词法环境的环境记录项是对象式环境记录项,该环境记录项绑定了全局对象(浏览器环境下是window)。所以可以直接访问parseInt。

全局执行环境的this绑定了全局对象(浏览器环境下是window)。所以在全局执行环境的代码this.parseInt是存在的。

执行new、执行函数时,创建的词法环境的环境记录项,都是声明式环境记录项。

执行with时,创建的是对象式环境记录项。

执行with时,会创建新的词法环境,当前执行环境的词法环境,会指向这个新的词法环境。(新的词法环境的外部词法环境,是之前的那个词法环境)

各种书籍、博客上说的作用域,在规范中并没有起专门的章节去说明。也就是说它在规范中有更好的术语表示或者说明。这个术语就是词法环境。更准确的说,是变量环境形成的词法环境链。

变量提升的意义,在于保证把声明的变量和函数绑定在词法环境的声明式环境记录项,而不会绑定到之后with创建的词法环境的对象式环境记录项。

定义绑定初始化遇到函数定义时,会将当前变量环境作为函数对象的[[scope]]属性,将形参作为[[formalParameters]]属性。

函数执行时,根据实参和函数对象的[[formalParameters]]属性,创建Argument对象。该Argument对象被绑定到当前执行环境的变量环境的环境记录项中的argument。

当前执行环境搜索标识符时,都是从它的词法环境获取的。

this不是从词法环境取的,this是执行环境的组件。

this实际上是动态作用域的实现,而不是词法作用域的实现。

举个实际的例子

function test(){
with(this){
var tt = 'tt';
console.info(this.tt);//undefined
}
}
new test();
var aaa = 'aaa'
console.info(this.aaa) //aaa
/**
 * 解释:执行代码之前,解释器会先创建一个 全局对象window,一个唯一的全局词法环境,这个全局词法环境的环境记录项的类型为 对象式环境记录项,这个对象式环境记录项 绑定了全局对象。
 * 然后创建全局执行环境,它的this绑定全局对象window,它的词法环境 指向 全局词法环境,它的 变量环境 指向 全局词法环境。
 * 所以,在全局执行环境,代码中的this,就是window。var一个变量时,这个变量会添加到全局执行环境的变量环境,由于该变量环境是对象式变量环境,绑定的是window对象,所以声明的变量,会成为window的属性。
 * 所以有 console.info(this.aaa)输出aaa
 * 
 * 那为什么console.info(this.tt);输出的是undefined
 * 执行new test()时,会创建一个新的执行环境(test-executeContext),该执行环境有一个词法环境,变量环境,this。
 * test-executeContext的词法环境是一个新的词法环境对象(test-lex),它是一个声明式词法环境,它的外部词法环境是全局词法环境。它的环境记录项绑定了标识符tt。
 * test-executeContext的变量环境和test-executeContext的词法环境一开始指向同一个词法环境对象。
 * 执行with语句时,会创建一个新的词法环境(with-lex),它是一个对象式词法环境,绑定了new test()创建的对象(test-instance)。在其中声明的变量,都会作为test-instance的属性。
 * 但是!!!js中有一个技术叫做变量提升技术。上面的变量tt,实际上属于test-lex,而不属于with-lex。所以tt不会成为test-instance的属性。
 * 我们没法像全局环境一样,var一个变量,它会成为this引用的对象的属性!
 * */
this.bb  = 'bb';
console.info(bb);

ECMA-262理解相关推荐

  1. ECMA 262 13 Expressions

    1 Identifiers 语法 2 Primary Expression 语法 PrimaryExpression [Yield, Await]_{\text{[Yield, Await]}}[Yi ...

  2. ES5-1 发展史、ECMA、编程语言、变量、JS值

    1. 5大主流浏览器及内核(自主研发) 浏览器 内核 IE trident Chrome webkit blink Safari webkit Firefox gecko Opera presto 2 ...

  3. 理解 JavaScript 闭包

    简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包是 ECMAScript (Ja ...

  4. 理解 JavaScript 闭包{转载}

    本文转载自:http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html 要成为高级 JavaScript 程序 ...

  5. 关于ECMA、ECMAScript、TC39、ES、Stage等概念的科普

    快速通道: ES6.ES7.ES8.ES9.ES10.ES11.ES12.ES13新特性大全 提到ECMA.ECMAScript.TC39.ES ,你可能对这些名词代表的概念一知半解甚至是从未了解过, ...

  6. 一个人就需要对象之js中八种创建对象方式

    前言:说,点进来是不是喜欢我的笑容!!!大家好,我叫C乐,(恩,很直不gay)一名退役的大学生,喜欢摩旅.从上课的一次css接触后,便喜欢上了前端,以下是我的一些学习笔记,站在前辈们的肩膀上,分享一些 ...

  7. [转]Javascript 闭包

    [转]Javascript 闭包 简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭 ...

  8. 前段第44天------前端、前端三剑客、HTML

    一.前端 定义:前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页. 前端技术:前端设计:一般可以理解为网站的视觉设计 前端开发:网站的前台代码实现,包括基本的HTML和CSS以及 ...

  9. 共享一些知识点的学习地址

    seajs,grunt,nodejs,npm: http://www.seajs.org http://gruntjs.com/ http://nodejs.org/ https://npmjs.or ...

  10. Easyjs 细说Javascript里的 闭包(Closure)

    要成为高级 JavaScript 程序员,就必须理解闭包.闭包有时你非用她不可, 所有理解闭包还是必要的.笔者通过例子来说一下"闭包" 1.定义一个函数的代理: function  ...

最新文章

  1. 谷歌 notification 测试 页面
  2. findbugs:may expose internal representation by ret
  3. [转]hibernate------HQL总结
  4. AlphaZero进化论:从零开始,制霸所有棋类游戏
  5. USACO 2.1 健康的好斯坦奶牛 (DFS)
  6. STM32之独立版USB(Host)驱动+MSC+Fatfs移植
  7. 使用Nexus2.x为Maven3.x搭建私服构件仓库
  8. apache ignite_使用Apache Ignite优化Spark作业性能(第1部分)
  9. partial is not defined的解决办法
  10. Tips--解决No module named matlab.engine的问题
  11. jconsole命令 Java Monitoring and Management Console
  12. Myeclipse中点(.)不出来方法或者属性?
  13. 台式电脑主板插线步骤图_主板电池怎么放电?电脑主板电池放电的方法
  14. 如何利用数据挖掘结束单身
  15. [译文]使用VBA-SDL-H寻找图片
  16. 在Ubuntu Kylin 优麒麟系统中安装 Etcher镜像烧录软件
  17. 连线杂志:《愤怒的小鸟》长成记
  18. html中显示框框中对勾,如何打出方框里有对勾
  19. push_back讲解
  20. 微信又更新了,分享几个实用的微信神器

热门文章

  1. W3B x Sui Hacker House|深入了解Sui和Move语言
  2. 原生js模拟jQuery选择器功能及方法
  3. 服务器关机选择项目,服务器设置关机任务计划
  4. Nancy之基于Nancy.Hosting.Aspnet的小Demo
  5. 个人形象设计之服装风格的认知
  6. 基于I2S通讯MAX98357模块的JetsonNano声音外放
  7. Scratch 3.0 项目编译
  8. 驱鸟器之驱鸟需求分析
  9. 小W的Java学习之路:java基础(四)-数组
  10. Android静默升级的菜鸟教程