- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaScript系列文章:从let和const谈起
JavaScript系列文章:从let和const谈起
注册博客园账号也有好些年了,有事没事经常来逛逛,感觉博客园的同学们一直都很活跃,相比国内其他社区来讲,这里的技术氛围很浓,非常适合学习和交流,所以博主我也决定在这里驻扎了,在这里,博主希望能坚持写一些JavaScript方面的文章,并和大家一起交流和探讨。
最近接触到ES6的一些相关新特性,想借let和const两个命令谈谈JavaScript在变量方面的改进。
由于let和const有很多相似之处,我们就先说一说let吧。
1. let添加了块级作用域
我们知道,JavaScript是没有块级作用域的,如果在块内使用var声明一个变量,它在代码块外面仍旧是可见的:
复制代码
if (true) {
var foo = 3;
}
console.log(foo); // 3
for (var i = 0; i lt; 9; i++) {
var j = i;
}
console.log(i); // 9
console.log(j); // 8
复制代码
可以看到,在上面代码中,我们虽然是在块内声明的变量,但代码块执行完毕后,依然可以访问到相应的变量,说明JavaScript中没有块级作用域的。
而ES6规范给开发者带来了块级作用域,如果把var换成let命令,我们就可以获得一个块级变量:
复制代码
if (true) {
let foo = 3;
}
console.log(foo); // Uncaught ReferenceError
for (let i = 0; i lt; 9; i++) {
let j = i;
}
console.log(i); // Uncaught ReferenceError
console.log(j); // Uncaught ReferenceError
复制代码
从上面代码可以看出,块内声明的变量,块外是不可见的,如果试图引用一个块内用let声明的变量,就会引发一个异常。
2. let约束了变量提升
在JavaScript中,变量提升是很常见的,例如下面这段代码:
function hoistVariable() {
console.log(#39;foo:#39;, foo); // foo: undefined
var foo = 3;
}
hoistVariable();
在代码正式执行之前,编译器将会对代码进行预编译分析阶段,在这个阶段,当前作用域中的变量和函数,将被提升到作用域的顶部。(注:目前的JavaScript引擎大都对源代码进行了编译处理,并且预编译和提升是抽象出来的概念。)
经过预编译之后的代码逻辑如下所示:
复制代码
function hoistVariable() {
var foo;
console.log(#39;foo:#39;, foo); // foo: undefined
foo = 3;
}
hoistVariable();
复制代码
ES6中的let命令规范了变量的声明,约束了变量提升,也就是说,我们必须先声明,然后才可以使用,下面者段代码将会报错:
function nonHoistingFunc() {
console.log(#39;foo:#39;, foo); // Uncaught ReferenceError
let foo = 3;
}
nonHoistingFunc();
正确的使用方式是,永远将变量声明置于当前作用域顶部:
function nonHoistingFunc() {
let foo = 3;
console.log(#39;foo:#39;, foo); // 3
}
nonHoistingFunc();
需要注意的是,不管是var还是let,预编译过程中,都发生了变量提升,但与var不同的是,ES6对let进行了约束,其规定,在真正的词法变量声明之前,以任何方式访问let变量都是不允许的,所以从开发人员角度来看,let禁止了变量提升这一行为。
关于这一点,大家可以参考ES6规范中“let和const变量的声明”。
3.
您可能关注的文档
- 2017届浙江省衢州、丽水、湖州、舟山四地市高三下学期教学质量检测联考生物试卷(带解析).doc
- 2017届湖北省黄冈市高三3月份质量检测文综地理试题 解析版.doc
- 2017届河南省天一大联考高三阶段性测试(五)文综政治试题 解析版.doc
- 2017届河南省开封市立洋外国语学校高三上学期第一次月考理科数学试题(解析版).doc
- 2017届浙江省“七彩阳光”新高考研究联盟高三下学期期初联考历史试卷(解析版).doc
- 2017届甘肃省武威市二中高三上期第三次诊断考试历史试卷(解析版).doc
- 2017届湖南师范大学附属中学高三第7次月考试题 文综政治 解析版.doc
- 2017届辽宁省重点高中协作校高三上期末历史试卷(解析版).doc
- 2017届重庆市第一中学高三下学期第一次月考文科综合历史试卷(解析版).doc
- 2017届重庆市第一中学高三下学期第二次月考理科综合生物试题(带解析).doc
- 2021-2022学年湖南省常德市安乡县四年级上学期期中语文真题及答案.pdf
- 2023-2024学年河南省南阳市社旗县四年级上学期期中数学真题及答案.pdf
- 2022-2023学年云南省曲靖市四年级下学期期末数学真题及答案.pdf
- 2021-2022学年河南省周口市鹿邑县二年级下册月考语文真题及答案.pdf
- 2018年河南焦作解放区教师招聘考试真题及答案.pdf
- 2019年江西公务员行测考试真题及答案-乡镇.pdf
- 2019中国石油报社应届高校毕业生招聘试题及答案解析.pdf
- 光大银行招聘应届毕业生能力素质测试笔试真题及答案.pdf
- 2024年广西百色教师招聘考试模拟题及答案.pdf
- 2021-2022学年浙江绍兴诸暨市五年级上册语文期末试卷及答案.pdf
文档评论(0)