1.首先我们需要知道js的编译顺序
1.1 js的编译是从上至下的,也就是说是从第一行开始,到最后一行结束。
1.2 在js编译完成后,浏览器是有一个全局对象 window,
2#.先说使用var关键字声明的变量,先说结论:通过var关键字声明的变量,会在js代码语句执行前进行执行,也就是说只要是通过var声明的变量,无论在第几行,都会先进行声明(但是,仅仅是声明,并没有赋值!)
使用var声明变量,可以进行变量提升,下面我来说说什么是变量提升
变量提升: 会在js代码语句执行前进行执行,也就是说只要是通过var声明的变量,无论在第几行,都会先进行声明(但是,仅仅是声明,并没有赋值!)
下面是代码案例
//1.
var a=123;
console.log(a); //直接打印123,没问题,因为js从上往下执行, a已经被声明并且被赋值为123
//2.
console.log(a); //直接打印undefined,原因通过var关键字声明的变量,
//会在js执行前进行执行,也就是说只要是通过var声明的变量,
//无论在第几行,都会先进行声明(但是,仅仅是声明,并没有赋值!,所以打印结果是undefined)
var a=123;
3#.let关键字声明变量 先说结论:通过let关键字声明的变量,无法进行变量提升!也就是说,通过let关键字声明的变量只能在声明后进行使用,否则会报错!
代码案例如下:
//1.
// let a=123;
// console.log(a); //直接打印123,没问题,因为js从上往下执行, a已经被声明并且被赋值为123
//2.
// console.log(a); //直接报错,原因通过let关键字声明的变量,
// //无法进行变量提升,js不会提前声明,只有执行到该变量声明的语句时才会声明变量
// //由于在声明前使用变量,所以会报错!
// let a=123;
4#.直接声明变量,不使用任何关键字,先说结论:直接声明的变量,无法进行变量提升!也就是说,直接声明的变量只能在声明后进行使用,否则会报错!
代码案例如下
//1.
// a=123;
//console.log(a); //直接打印123,没问题,因为js从上往下执行, a已经被声明并且被赋值为123
//2.
// console.log(a); //直接报错,原因直接声明的变量,
// //无法进行变量提升,js不会提前声明,只有执行到该变量声明的语句时才会声明变量
// //由于在声明前使用变量,所以会报错!
//a=123;