这是我参与8月更文挑战的第十六天,活动详情查看:8月更文挑战
变量声明
ES6之前,var都是声明变量的唯一关键字。ES6不仅增加了let和const两个关键字,而且还让这两个关键字压倒性地超越了var成为首选。
使用let的块级作用域声明
ES6新增的let关键字和var很像,但是let的作用域是块级的。块级作用域由最近的一对花括号决定{}。
if(true){
let a = 1;
}
console.log(a) //ReferenceError: a没有定义
let与var的另一个不同在于同一个作用域内不能声明两次。重复的var声明会被忽略,重复的let声明会抛出SyntaxError。严格来说,let在JavaScript运行的时候其实也会被提升,但是由于“暂时性死区”的缘故,实际上不能在声明之前使用let变量。因此,从写JavaScript代码的角度来说,let的提升跟var是不一样的。
使用const的常量声明
除了let,ES6还新增了const关键字,使用const声明的变量必须同时初始化为某个值。const声明只应用到顶级原语或者对象。
const o1 = {};
o1 = {}; // TypeError: 给常量赋值
const o2 = {};
o2.name = 'Jujin';
console.log(o2.name); // 'Jujin'
标识符查找
当在特定上下文中为了读取或者写入而引用一个标识符时,必须通过搜索确定这个标识符表示什么。搜索开始于作用域链前端,以给定的名称搜索对应的标识符。如果再局部上下文中找到该标识符,则搜索停止,变量确定;如果没有找到变量名,则继续沿作用域链搜索。(注:作用域链中的对象也有一个原型链,因此搜索可能涉及到每个对象的原型链。)这个过程一直持续到搜索至全局上下文的变量对象,如果仍然没有找到标识符,则说明其未声明。
需要注意的是,访问局部变量比访问全局变量要快,因为不用切换作用域。不过,JavaScript引擎在优化标识符查找上做了很多工作,后续可能这个差异就微不足道了。