var的缺点:
- 可以重复声明
- 没有块级作用域
- 无法限制修改
ES6之前JavaScript只有全局作用域和局部作用域,ES6新增了块级作用域(就是一对{}产生的作用域)
1、变量只在块级作用域中访问,防止内层变量覆盖外层变量(变量赋值规则),避免了变量冲突
2、防止循环变量变成全局变量(for循环)
<button >按钮1</button>
<button >按钮2</button>
<button >按钮3</button>
<script>
var btn = document.querySelectorAll('button')
for (let i = 0; i < btn.length; i++) {
btn[i].onclick=function(){
alert(i)
}
}
</script>
let:
作用:变量可以赋值
特点:
1、块级作用域
2、不存在变量提升(只能先声明,再使用)
3、暂时性死区
var num = 123
if (true) {
console.log(num) // 不会输出任何值
let num
}
const
应用:声明的数据不需要变化,比如函数的定义,π值(数学中恒定不变的值),由于值不会变化,JS引擎不会实时监视,效率会更高
作用:声明常量,常量就是值(内存地址)不能变化的量
特点:
1、块级作用域{}
2、必须赋初始值 const a = 10
3、赋值后,值不可更改,但是可以改变复杂数据类型的内部值(比如数组,对象,函数)
闭包(函数):外部作用域访问函数内局部变量,作用:延伸了变量的作用范围
递归(函数):一个函数在内部调用其本身,递归函数和循环效果一样,由于递归很容易发生“栈溢出”错误,所以递归函数必须要加退出条件return