let var const 有什么区别?
首先从广义来讲:
let 没有变量的提升,有块级作用域,不能重复声明,有暂时性死区
var 有变量的提升,没有块级作用域,可以重复声明
const 没有变量提升,声明的变量为常量,一旦定义值不能改变,有块级作用域
??? 那么问题来了,对于js底功不好的人来说根本不懂这是什么意思啊。
A 首先什么是变量的作用域?
1.函数体为 函数作用域,任意一个 {} 内为一个 块级作用域
2.var 声明的变量,在函数作用域中生效,所以只有在函数中声明的变量属于局部变量,在代码块中声明的依然为全局变量,代码块就是在函数外面。
注意
1、出于代码的可维护性上,不推荐省略关键字直接定义变量的方式;
2、在严格模式下,不支持省略关键字直接定义变量的方式;
3、var 可以重复声明,let 和 const 不可重复声明;
4、在全局作用域下,var 声明的变量会成为 window 对象的属性, let 和 const 不会;
3、定义在 window 的全局变量,不推荐使用 var 声明 或 省略关键字直接定义,推荐使用 window.message = 'hi' 的方式。
B 什么是变量提升?
var a = '变量'
function fn (){
console.log(a);//undefined
var a = 'hello'
}
fn()
变量a打印为什么是undefined 空呢?
是因为var声明的变量有一个变量的提升,当你在函数体内有相同变量而且你声明的变量在调用的变量前他就会给你来一个变量提升自动解析成↓
var a = '变量'
function fn (){
var a //声明变量没复值
console.log(a);//调用 = undefined
a == 'hello'//最后复值
}
fn()
这就是变量提升,var 有变量的提升 let const 没有变量提升
暂时性死区:
console.log(a);//调用在前
let a = 'a'//声明的变量在后
会报错:↓
y.html:33
Uncaught ReferenceError: Cannot access 'a' before initialization
总结(最佳实践)
-
不使用
var -
const优先,let其二 -
在 window 上添加属性,直接使用 window['属性'] = 属性值