在我们初学javaScript时使用var来声明变量,但是使用var声明变量会遇到变量提升等问题,而且只有全局作用域和函数作用域这种蛋疼的问题。于是在2015年ECMA组织发布了es6,带来了新的声明变量的关键字。
let关键字
1. let声明的变量 只在let所在的代码块起作用,形成块级作用域
之前我们使用var在if语句或者for语句声明变量时,在if外面的作用域也可以访问到,而使用let声明的变量会形成块级作用域,只在声明的花括号{}内部有效。
if (true) {
let num = 12;
}
console.log(num);
最后的结果会报错:
报错:ReferenceError: num is not defined
引用错误 num未被定义
2.使用let声明的变量,可以重新赋值,但是不能重新声明
使用var声明的变量,var a=12;再接着var a=5;
而let声明的变量不可以。
var sw = 8;
sw = 9;
console.log(sw);
var sw = 10;
console.log(sw);
let num = 13;
num = 14;
console.log(num);
let num = 15;
console.log(num);
最后的结果也会报错:
报错:SyntaxError: Identifier ‘num’ has already been declared
语法错误 标识符num已经被声明过了
3.let声明的变量 不会变量提升 必须在声明并且赋值之后才能使用
学过作用域,作用域链就知道在进行预编译的时候会被提前存到GO或者AO里值为undefined。所以就算你在变量之前打印该变量也可以打印出undefined
console.log(sw);
var sw=5;
console.log(num);
let num=10;
最后的结果
undefined和报错
报错:ReferenceError: Cannot access ‘num’ before initialization
引用错误 不能在num初始化之前访问
4.暂时性死区
虽然这东西可以和第三点一起说,但是还是单独拿出来提一嘴。
直接看例子:
if(true){
console.log(typeof num);
console.log(typeof sw);
let sw=12;
}
不知道大伙平时有没有注意到一点。typeof一个你没有声明的变量,他会默认输出undefined(算是默认这个变量存在)。
这个最后的结果也是
undefined和报错
报错:ReferenceError: Cannot access ‘sw’ before initialization
和第三点一样都是 引用错误 不能在num初始化之前访问
5. 在全局作用域内使用let声明的变量 但是不属于全局对象的属性
在全局作用域声明的变量可以window打点找到他,而let声明过得变量不行
var num=5;
console.log(window.num);
let sw=12;
console.log(window.sw);
最后的结果
5和undefined
const声明常量
const就是声明一个只读的常量 一旦声明之后 他的值就不能再改变。
而且在平时使用中建议大伙,声明的常量使用大写字母如:const NUM=12;
先说第一点:
1.一旦声明之后 常量的值就不能再改变(声明过后 不允许改变内部存储的地址)
const NUM = 12;
NUM = 13;
console.log(NUM)
然后理所当然报错了:
报错: TypeError: Assignment to constant variable.
类型错误 ,给一个常量赋值
2.声明之后必须赋值
直接看例子:
const NUM ;
NUM = 13;
console.log(NUM)
一样,也报错了:
报错: SyntaxError: Missing initializer in const declaration
语法样式 常量声明没有初始化
3.和let一样会形成块级作用域, 只在const所在的代码块起作用
if (true) {
const NUM = 5;
}
console.log(NUM);
ReferenceError: NUM is not defined
引用错误 num未被定义
4.跟let一样 不能重复声明 不能声明提前
这我就不举例了可以把上面let的例子换成const测试一下。
案例
let和const还是挺有用的,比如之前有个很经典的问题?
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
},1000)
}
最后打印十个10,如果我们想让他从0-9打印只需要把for里的i换成let来声明,就可以了。
(如果这篇文章有什么问题请及时联系我!)