ECMA-262理解
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理解相关推荐
- ECMA 262 13 Expressions
1 Identifiers 语法 2 Primary Expression 语法 PrimaryExpression [Yield, Await]_{\text{[Yield, Await]}}[Yi ...
- ES5-1 发展史、ECMA、编程语言、变量、JS值
1. 5大主流浏览器及内核(自主研发) 浏览器 内核 IE trident Chrome webkit blink Safari webkit Firefox gecko Opera presto 2 ...
- 理解 JavaScript 闭包
简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭包是 ECMAScript (Ja ...
- 理解 JavaScript 闭包{转载}
本文转载自:http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html 要成为高级 JavaScript 程序 ...
- 关于ECMA、ECMAScript、TC39、ES、Stage等概念的科普
快速通道: ES6.ES7.ES8.ES9.ES10.ES11.ES12.ES13新特性大全 提到ECMA.ECMAScript.TC39.ES ,你可能对这些名词代表的概念一知半解甚至是从未了解过, ...
- 一个人就需要对象之js中八种创建对象方式
前言:说,点进来是不是喜欢我的笑容!!!大家好,我叫C乐,(恩,很直不gay)一名退役的大学生,喜欢摩旅.从上课的一次css接触后,便喜欢上了前端,以下是我的一些学习笔记,站在前辈们的肩膀上,分享一些 ...
- [转]Javascript 闭包
[转]Javascript 闭包 简介 Closure 所谓"闭包",指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 闭 ...
- 前段第44天------前端、前端三剑客、HTML
一.前端 定义:前端即网站前台部分,运行在PC端,移动端等浏览器上展现给用户浏览的网页. 前端技术:前端设计:一般可以理解为网站的视觉设计 前端开发:网站的前台代码实现,包括基本的HTML和CSS以及 ...
- 共享一些知识点的学习地址
seajs,grunt,nodejs,npm: http://www.seajs.org http://gruntjs.com/ http://nodejs.org/ https://npmjs.or ...
- Easyjs 细说Javascript里的 闭包(Closure)
要成为高级 JavaScript 程序员,就必须理解闭包.闭包有时你非用她不可, 所有理解闭包还是必要的.笔者通过例子来说一下"闭包" 1.定义一个函数的代理: function ...
最新文章
- 谷歌 notification 测试 页面
- findbugs:may expose internal representation by ret
- [转]hibernate------HQL总结
- AlphaZero进化论:从零开始,制霸所有棋类游戏
- USACO 2.1 健康的好斯坦奶牛 (DFS)
- STM32之独立版USB(Host)驱动+MSC+Fatfs移植
- 使用Nexus2.x为Maven3.x搭建私服构件仓库
- apache ignite_使用Apache Ignite优化Spark作业性能(第1部分)
- partial is not defined的解决办法
- Tips--解决No module named matlab.engine的问题
- jconsole命令 Java Monitoring and Management Console
- Myeclipse中点(.)不出来方法或者属性?
- 台式电脑主板插线步骤图_主板电池怎么放电?电脑主板电池放电的方法
- 如何利用数据挖掘结束单身
- [译文]使用VBA-SDL-H寻找图片
- 在Ubuntu Kylin 优麒麟系统中安装 Etcher镜像烧录软件
- 连线杂志:《愤怒的小鸟》长成记
- html中显示框框中对勾,如何打出方框里有对勾
- push_back讲解
- 微信又更新了,分享几个实用的微信神器