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