ES6中的变量声明
ECMAScript与JavaScript的区别
前者是后者的规格,后者是前者的一种实现
1.let
let用来声明变量,用法类似于var
let与var的区别:
1.let存在块级作用域,而var不存在块级作用域
1 | { |
典型的for循环例子 :
1 | //案例1 |
var不合理的场景:
第一种场景,内层变量可能会覆盖外层变量。
第二种场景,用来计数的循环变量泄露为全局变量。
2.let不存在变量提升
1 | console.log(number); // undefined |
var会有变量提升,上面的代码可以等同为:
1 | var number; |
而let不存在变量提升,在执行到打印number2的时候number2没有定义
3.暂时性死区(TDZ)
1.不受外部影响:只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
2.不可以在声明前使用:ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
1 | tmp = 'abc'; // ReferenceError |
4.不允许重复声明
1 | //报错 |
1 | //不报错 |
2.const
const用来声明一个只读的常量,如果尝试更改将会报错,对于引用类型的数据来说,只要保证地址值不变,就不会报错
1 | const foo ={}; |
如果不希望更改对象内部的属性,可以将对象冻结,任何修改将不会起作用,Object.freeze()
const拥有块级作用域,没有变量提升,存在暂时性死区
3.顶层对象
在ES5,顶层对象的属性(在浏览器环境下,顶层对象指的是window)与全局变量是等价的
1 | window.a = 1; |
在ES6中,全局变量不属于顶层对象的属性了
1 | var a = 1; |
如果这篇文章对你有帮助,可以bilibili关注一波 ~ !此外,如果你觉得本人的文章侵犯了你的著作权,请联系我删除~谢谢!