var&&let&&const

let:
1、不能再同一个作用域里重复声明同一个变量。(报错:语法,重复声明)
2、全局作用域中let声明的变量不会自动成为Window对象的属性
3、let声明的变量 用变量提升的,该变量之前成为暂时性死区(变量已在当前的作用域但是不能够进行使用)
4、let声明的变量没有赋值就会报错
5、let声明的变量会让{}()自动成为代码块,全局作用域无法访问

var:
1、能够在同一个作用域里重复声明同一个变量。
2、全局作用域中var的变量会自动成为window对象的属性。
3、var声明的变量存在 变量声明提升,js引擎会把var声明的变量提到最前面 执行到相应代码时进行赋值。
4、var声明的变量没有赋值是undefined
5、var声明的变量不能让{}()生成块级作用域。

const:
1、用来声明变量的 (一般用来声明不会改变的量 如:圆周率、光速、)
2、声明的同时要赋值,否则报错
3、声明的常量如果是原始值则该常量不能被修改,引用值在不修改常量地址的情况下可以修改

1、var声明 for() 中的()不存在块级作用域。
var a = 0;
for (var i = 0; i < 5; i++) {
a += i;
}
console.log(a, i)
在这里插入图片描述
let声明 for() 中的()存在块级作用域。
var a = 0;
for (let i = 0; i < 5; i++) {
a += i;
}
console.log(a, i)
在这里插入图片描述

2、var 声明的 {}不存在代码块
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
}), 0
}
在这里插入图片描述

首先是for循环他是可以会很快的执行完的,然后内部定义一个0ms的延迟函数 脱离主线程 在主线程执行完毕后执行这个函数  内部没有i 会向上访问 ,会找全局的i而这个全局的i是for循环结束后的i(i=5),那么就会执行for循环代码在1秒后就打印5次5

let声明的 {}存在代码块
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
}, 0)
}
在这里插入图片描述
当延迟的回调函数里面要打印i,现在回调函数是在块级作用域中,这个块级作用域中是没有i的那我会顺着()括号这个块级作用域去找(父级),而父级作用域里面是有i的所以说我找到了,在回调函数打印i的时候其实就找到了()括号作用域里面的i值是0,如此循环反复5圈
回调函数所处环境就是{}号块级作用域内,这个块级作用域所处的环境是()号块级作用域中,所以说就连成一条链。
这个回调函数所处的环境不像var声明的变量了,var是在全局作用域中,但是let声明的变量不一样,let就延长了匿名函数的作用域链,匿名函数所处环境–>{}块级作用域–>()作用域–>全局作用域(这是一条作用域链被延长了)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值