变量提升
首先看代码例子:
console.log(a);//输出 undefined
var a = 1;
var关键字声明的变量会进行变量提升,所以是输出undefined。
那么其内部原理是什么样的呢?
首先可以理解为这样:
var a;
console.log(a);
a=1;
JavaScript会把 var a=1看为2步,var a和a=2,变量的声明是在代码编译阶段(也可以说是预处理阶段)进行的,然后变量的赋值是在代码执行阶段执行的。
函数提升
看代码例子:
fn();//输出 哈哈
function fn() {
console.log("哈哈");
}
在函数调用之前,JS会把fn这个函数体编译一遍,但是不是调用,所以可以理解为这样:
function fn() {
console.log("哈哈");
}
fn();//输出 哈哈
上图:在函数声明之前,打印window下的fn输出该函数体,所以在函数调用执行之前,函数已经进行了编译。
变量提升和函数提升哪一个优先呢?
看一个例子:
{
var c = 1;
function c(c) {
console.log(c);
}
c(2);//报错 :c is not a function!
}
JS中函数提升会高于变量提升
上面代码执行顺序:
1.首先进行编译,首先对函数进行提升,这时候c是一个函数,然后再进行变量提升,然后这时候的c就从一个函数变成了一个变量。
2.编译完成再进行执行,然后就是给c赋值:c=1,所以c还是变量,当遇到c(2)的时候,因为c最后已经是变量了,所以这里就直接会报错说:c is not a function!。
上面的步骤用代码可以表示为:
{
//编译阶段:
function c(c) {
console.log(c);
}
var c;
//执行阶段:
c = 1;
c(2);//报错 :c is not a function!
}