理解变量提升
ES5提供了两种变量声明的方式,分别是var和function。var是变量声明,function是函数声明。函数声明优先于变量声明 ,解析器会率先读取函数声明,并使其在执行任何代码之前可用。
理解一个过程
程序员都知道计算机只能识别0和1,也就是二进制。那么计算机是怎么识别代码的呢?计算机执行代码前会先将代码编译 成二进制文件,在运行时这个二进制文件会进过一个解析器 ,计算机能准确执行解析后的代码。
而ES5中函数声明优先于变量声明正是因为解析器在向执行环境中加载数据时,对函数声明和变量声明没有没有一视同仁 ,解析器会率先读取函数声明,并使其在执行任何代码之前可用。
函数提升过程
//提升前
console.log(sum(5,10)); //输出15,不报错
function sum(a,b){
return a+b;
}
//解析器解析后代码执行顺序,函数声明被提升。
function sum(a,b){
return a+b;
}
console.log(sum(a,b));
变量提升
//提升前
console.log(a); //undefined
var a=10;
//提升后
var a; //变量只声明未赋值,变量值初始化为undefined,这是输出undefined的原因
console.log(a); //undefined
a = 10; //变量在‘原地’赋值,即赋值没提升
声明后为初始化的变量会保存一个特殊的值——undefined.
变量和函数共存时
//提升前
log(); //"Hello world!"
var a = 10;
console.log(a); //10
console.log(b); //undefined
var b = 20;
function log(){
console.log("Hello world!");
}
console.log(b); //20
//提升后
function log(){ //函数声明优先于变量声明
console.log("Hello world");
}
var a;
var b;
log(); //"Hello world"
a = 10;
console.log(a); //10
console.log(b); //undefined
b = 20;
console.log(b); //