为何要出现let和const呢?确定是var很差(var:呵呵!)。
var存在的问题:
1.变量声明提高
2.可重复定义
3.全局变量挂载到window上。
这些是js在设计时候的缺点,容易在开发中致使不少错误。全局变量挂载到window上不一样意查找,并且容易覆盖。
闭包也是很是头疼的问题,下面例子原本是想打印1,3,5的,然儿会输出10,10,10。git
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,5github
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来弥补这些缺点了。web
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个10spa
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。code
function na(a,b) {
let a = 10 //报错,形参至关于var a
}
na()
复制代码
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邮箱:同上,呵呵!