在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只要全局作用域和函数作用域。变量提拔行将变量声明提拔到它地点作用域的最最先的部份
引擎会在诠释 JavaScript 代码之前起首对其举行编译(没错,JavaScript
也是要举行编译的!),而编译阶段中的一部份事情就是找到一切声明,并用适宜的作用域将他们关联起来,即
包含变量和函数在内的一切声明都邑在任何代码被实行前起首被处置惩罚。
1.引擎在剖析 JavaScript 代码之前起首对其举行编译。编译阶段中的一部份事情就是找到一切的声明,并用适宜的作用域将它们关联起来;
2.变量和函数在内的一切声明都邑在任何代码被实行前起首被处置惩罚;
3.当定义一个 var a = 1; 时,可能会以为这是一个声明。但 JavaScript 现实上会将其算作两个声明: var a; 和 a = 1; 。第一个定义声明是在编译阶段举行。第二个赋值声明会被留在原地守候实行阶段。
**
函数提拔
**
剖析器在剖析时对函数声明与函数表达式有着差别的优先级,现实上编译阶段函数声明会先于变量被提拔,并使其在实行任何代码之前可接见,函数表达式现实上是变量声明的一种,因而函数声明提拔优于函数表达式
函数声明才存在函数提拔
var num = 20;
function test(){
console.log(num); // 20
num = 10; //去掉了var 就变成定义了全局变量了
console.log(num); // 10
}
test();
console.log(num); // 10
表面的是全局的。内里的能够接见它,内里定义的在输出背面,且不能变量提拔。所以,就输出表面的20了
函数声明和变量声明都邑被提拔。然则函数会起首被提拔,然后才是变量。
局部变量 变量声明提拔
var a= 20;
function numa(){
console.log(a); // undefined
var a= 10; //局部变量
console.log(a); // 10
}
numa();
因为函数体内存在变量声明提拔,所以上面代码现实运转以下:
var a = 20;
function numa(){
var a;
console.log(a); // undefined
a = 10;
console.log(a); // 10
}
numa();