为什么会出现let和const
为什么要出现let和const呢?肯定是var不好(var:呵呵!)。
var存在的问题:
1.变量声明提升
2.可重复定义
3.全局变量挂载到window上。
这些是js在设计时候的缺点,容易在开发中导致很多错误。全局变量挂载到window上不同意查找,而且容易覆盖。
闭包也是非常头疼的问题,下面例子本来是想打印1,3,5的,然儿会输出10,10,10。
var arr = []
for (var i = 0;i <10;i++) {
arr[i] = function() {
console.log(i)
}
}
arr[1]() // 10
arr[3]() // 10
arr[5]() // 10
复制代码
如果使用let就会解决闭包问题,输出1,3,5
let arr = []
for (let i = 0; i < 10; i++) {
arr[i] = function () {
console.log(i)
}
}
arr[1]() // 1
arr[3]() // 3
arr[5]() // 5
复制代码
因为var存在这些缺点,所以就出现let来弥补这些缺点了。
let的优点:
1.不会出现声明提升 2.不可重复定义 3.加强作用域的控制 4.配合{}可以实现块级作用域:
if () {
// 块级作用域
}
while () {
// 块级作用域
}
for () {
// 块级作用域
}
switch () {
// 块级作用域
}
复制代码
声明不能提升
{
let a =10
{
//在里面可以访问外面let的变量
console.log(a) // 10
}
}
复制代码
let会产生临时性死区,临时性死区,只要在块级作用域中let变量,就不会访问外面同名变量。解决办法为重新设置个变量名。
{
let a = 10
{
//临时性死区,只要在块级作用域中let变量,就不会访问外面同名变量。解决办法为重新设置个变量名。
console.log(a) //报错,a没有被定义
let a = 20
}
}
复制代码
下面例子会帮助大家加深对let的理解。(能不能加深我也不知道,呵呵!)
因为setTimeout是异步加载当函数执行时i就已经变成10了,所以会输出10个10
for(var i = 0;i<10;i ++) {
setTimeout(() => {
console.log(i) //输出10个10
}, 0);
}
复制代码
如果var改成let就可解决这个问题。
for(let i = 0;i<10;i ++) {
setTimeout(() => {
console.log(i) //输出0,1,2...,9
}, 0);
}
复制代码
function形参相当于 var,里面不可用let重复声明,可以用var。
function na(a,b) {
let a = 10 //报错,形参相当于var a
}
na()
复制代码
const讲解:
const 是声明一个常量,声明之后不可被改变,开发中推荐使用const > let > var(别用var了,哈哈)
const PI = 3.14
const PI = 111 // 报错,不可改变
复制代码
const存储常量的值不会被改变,但是存储常量值对应的空间的值可以被改变
const arr = {}
arr.name = 'bb'
console.log(arr) //{name: "bb"}
arr.name = 'cc'
console.log(arr) //{name: "cc"}
复制代码
const除了不可被改变,其他的和let用法相同。\
有错误欢迎指出,谢谢观看。
广告:
作者github:github.com/webxukai
作者gitee:gitee.com/webxukai
作者微信:e790134972
作者QQ:我想你应该知道了!
作者QQ邮箱:同上,呵呵!