var
var声明全局变量,不具有块级作用域,切可以重复声明,没有暂时性死区
var a = 1
console.log(a); //打印结果1
var c = 2
function b() {
var a = 1
console.log(c); //打印结果2,在外部声明变量,函数内部可以获取到数据
console.log(a); //打印结果1,在内部声明变量,函数内部依旧可以获取到数据
}
b()
换句话来说,不管var声明的变量在哪,即使在for循环之外依旧可以使用
let
let具有块级作用域,切不可以重复声明变量,拥有暂时性死区(所谓暂时性死区,如果在一个封闭的块级变量里声明了let和const,从一开始就形成了一个封闭的作用域,只要是在声明之前使用这些变量,就会形成暂时性死区)
暂时性死区的场景
暂时性死区的场景
var a=a; //不报错 因为var可以变量提升 ,在等号赋值的时候是从右往左//使用变量a,此时a是undefined,赋值的是undefined
let a=a;//报错 赋值运算是从右往左,右边使用变量a结果发现a没有声明 ,而let语法规定不能再没定义之前使用变量,所以报错
let a = 3;
console.log(a);//在函数外部定义let输出a=3
function bbb() {
let c = 6;
console.log(a);//在函数内部定义输出a=6
}
bbb();
console.log(a);//调用let输出a=3
const
const用于声明常量,具有块级作用域,也可以声明块级,切const声明的变量不可以修改,必须初始化
const b = 2;
console.log(b);
b = 5;
console.log(b);//在函数外部修改变量无法输出
预解释
预解释又称变量提前声明,js代码执行之前,浏览器会把默认带过来的var和function先进性声明和定义
1.声明和定义
var a = 10
先是var声明 num
告诉浏览器全局变量中有一个num的变量,如果只是声明没有赋值,控制台打印underfind
定义了 num= 10
给变量进行了赋值
2.有var和function关键字的在预解释的时候操作是不同的
var在预解释的时候只是提前声明了一下
function在预解释的时候声明和定义都同步完成
3.预解释只发生在当前作用域下
如果没有定义作用域,会在window下进行预解释,如果有函数作用域的情况下,会在当前函数的作用域中进行预解释
变量提升
JavaScript 仅提升声明,而不提升初始化。如果你先使用的变量,再声明并初始化它,变量的值将是 undefined。
1:所有的声明都会提升到作用域的最顶上去。
2:同一个变量只会声明一次,其他的会被忽略掉。
3:函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升。