JS基础实战课件09_ES6~ES13新特性(一).pptx

JS基础实战课件09_ES6~ES13新特性(一).pptx

此“教育”领域文档为创作者个人分享资料,不作为权威性指导和指引,仅供参考
  1. 1、本文档共28页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

ES6~ES13新特性(一);;在执行学习JavaScript代码执行过程中,我们学习了很多ECMA文档的术语:

执行上下文栈:ExecutionContextStack,用于执行上下文的栈结构;

执行上下文:ExecutionContext,代码在执行之前会先创建对应的执行上下文;

变量对象:VariableObject,上下文关联的VO对象,用于记录函数和变量声明;

全局对象:GlobalObject,全局执行上下文关联的VO对象;

激活对象:ActivationObject,函数执行上下文关联的VO对象;

作用域链:scopechain,作用域链,用于关联指向上下文的变量查找;

在新的ECMA代码执行描述中(ES5以及之上),对于代码的执行流程描述改成了另外的一些词汇:

基本思路是相同的,只是对于一些词汇的描述发生了改变;

执行上下文栈和执行上下文也是相同的;

;词法环境是一种规范类型,用于在词法嵌套结构中定义关联的变量、函数等标识符;

一个词法环境是由环境记录(EnvironmentRecord)和一个外部词法环境(oute;r?LexicalEnvironment)组成;

一个词法环境经常用于关联一个函数声明、代码块语句、try-catch语句,当它们的代码被执行时,词法环境被创建出来;

也就是在ES5之后,执行一个代码,通常会关联对应的词法环境;

那么执行上下文会关联哪些词法环境呢?;LexicalEnvironment用于处理let、const声明的标识符:

VariableEnvironment用于处理var和function声明的标识符:

;在这个规范中有两种主要的环境记录值:声明式环境记录和对象环境记录。

声明式环境记录:声明性环境记录用于定义ECMAScript语言语法元素的效果,如函数声明、变量声明和直接将标识符绑定与ECMAScript语言值关联起来的Catch子句。

对象式环境记录:对象环境记录用于定义ECMAScript元素的效果,例如WithStatement,它将标识符绑定与某些对象的属性关联起来。;新ECMA描述内存图;在ES5中我们声明变量都是使用的var关键字,从ES6开始新增了两个关键字可以声明变量:let、const

let、const在其他编程语言中都是有的,所以也并不是新鲜的关键字;

但是let、const确确实实给JavaScript带来一些不一样的东西;

let关键字:

从直观的角度来说,let和var是没有太大的区别的,都是用于声明一个变量;

const关键字:

const关键字是constant的单词的缩写,表示常量、衡量的意思;

它表示保存的数据一旦被赋值,就不能被修改;

但是如果赋值的是引用类型,那么可以通过引用找到对应的对象,修改对象的内容;

注意:

另外let、const不允许重复声明变量;;let、const和var的另一个重要区别是作用域提升:

我们知道var声明的变量是会进行作用域提升的;

但是如果我们使用let声明的变量,在声明之前访问会报错;

那么是不是意味着foo变量只有在代码执行阶段才会创建的呢?

事实上并不是这样的,我们可以看一下ECMA262对let和const的描述;

这些变量会被创建在包含他们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值;

;我们知道,在let、const定义的标识符真正执行到声明的代码之前,是不能被访问的

从块作用域的顶部一直到变量声明完成之前,这个变量处在暂时性死区(TDZ,temporaldeadzone)

使用术语“temporal”是因为区域取决于执行顺序(时间),而不是编写代码的位置;;从上面我们可以看出,在执行上下文的词法环境创建出来的时候,变量事实上已经被创建了,只是这个变量是不能被访问的。

那么变量已经有了,但是不能被访问,是不是一种作用域的提升呢?

事实上维基百科并没有对作用域提升有严格的概念解释,那么我们自己从字面量上理解;

作用域提升:在声明变量的作用域中,如果这个变量可以在声明之前被访问,那么我们可以称之为作用域提升;

在这里,它虽然被创建出来了,但是不能被访问,我认为不能称之为作用域提升;

所以我的观点是let、const没有进行作用域提升,但是会在解析阶段被创建出来。;我们知道,在全局通过var来声明一个变量,事实上会在window上添加一个属性:

但是let、const是不会给window上添加任何属性的。

那么我们可能会想这个变量是保存在哪里呢?;在我们前面的学习中,JavaScript只会形成两个作用域:全局作用域和函数作用域。

ES5中放到一个代码中定义的变量,外面是可以访问的:;在ES6中新增了块级作用域,并且通过let、const、func

文档评论(0)

yzs890305 + 关注
实名认证
内容提供者

计算机二级持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年11月02日上传了计算机二级

1亿VIP精品文档

相关文档