暂时性死区:只要块级作用域内存在let命令,它所声明的变量就绑定这个区域,不再受外部影响。
暂时性死区:let.const
let,不允许重复声明,let不允许在相同作用域内,重复声明同一个变量;不能在函数内部重新声明参数;
const命令
声明一个只读的常量。一旦声明,常量的值就不能改变。
同时也说明,一旦声明,就要立即初始化,否则也报错。
与let相似:
const命令声明的常量也不提升,同样存在暂时性死区,只能在声明的位置后使用。
也不可以重复声明。
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const命令只
是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量,
必须非常小心。
const foo = {};
foo.prop = 123;
console.log(foo.prop);
//上面的常量foo存储的是对象的地址,这个地址不可变,但依然可以添加属性。const a = [];
a.push("hello");
a.length = 0;// a = ["Dave"] //报错,赋值就是更换地址,不行的。//如果真的想把对象冻结,应该使用Object.freeze方法。const foo2 = Object.freeze({});
//常规模式下,下面一行不起作用//严格模式下,会报错foo.prop = 123;
ES5只有两种声明变量的方法:var和function。
ES6有6种:var function let const class import
全局对象属性:
全局对象是最顶层的对象,在浏览器环境下指的是window对象,在node指的是
global对象。ES5中,全局对象的属性和全局变量是等价的。
未声明的全局变量,自动成为全局对象window的属性,这被认为是js的最大败笔。
ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,
依旧是全局对象的属性,另一方面规定,let,const,class命令声明的全局变量不属于全局对象的
属性。也就是说,从ES6开始,全局变量将逐渐与全局对象的属性脱钩。
ES5只有全局作用域和函数作用域,没有块级作用域,有很多不合理场景: