1、概念
变量提升:变量提升即将变量声明提升到它所在作用域的最开始的部分;
函数提升:函数提升即将函数的声明会提升到它所在作用域的最开始的部分。
2、举例说明
变量提升
console.log(a);//undefined
var a = 2;
console.log(a);//2
之所以会是以上的打印结果,是由于js的变量提升,实际上上面的代码是按照以下来执行的:
var a; // 变量提升,全局作用域范围内,此时只是声明,并没有赋值
console.log(a); // undefined
a= 'a'; // 此时才赋值
console.log(a); // 打印出2
es6里面定义变量,还有let,不存在变量提升的现象
console.log(a);//Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 2;
console.log(a);//2
函数提升:
函数提升的优先级大于变量提升的优先级
首先我们需要明白函数的三种定义方式:
function func1(){};//函数字面量
var func2 = function(){};
var func3 = new Function();
这三种定义方式,只有第一种方式才存在函数提升的现象,即第一种
function func1();
test1();//输出结果:2
test2();//Uncaught TypeError: test2 is not a function
function test1(){
console.log("123");
}
var test2 = function(){
console.log("test2");
}
之所以是上述现象是因为浏览器引擎对javascript代码的处理过程
function test1(){
console.log("123");
}// 函数提升,整个代码块提升到函数作用域的最顶端
test1();
test2();
var test2 = function(){
console.log("test2");
}