1、 变量提升

变量 声明 提升
通过var定义(声明)的变量,在定义语句之前就可以访问到
值:undefined

// fn()  输出undefined
var a = 3
function fn (){
   console.log(a)  // 下方使用var声明了a,出现变量提升,故此时的a是可以找到的,只不过a的值为undefined
   var a = 4     // var定义声明的变量会提升,最终相当于下方效果
   // var a
   // console.log(a)
   // a = 4
}
fn()   // undefined
// 为什么不是3,在fn执行的时候会优先从自己的作用域中寻找是否有a,发现下面定义声明了var a = 4,故不会跳出该作用域寻找var a = 3,且由于是var定义出现变量提升,如上方所示

2、 函数提升

函数 声明 提升
通过function定义(声明)的函数,在之前就可以调用
值:函数定义(对象)

// fn2()  可以调用执行,下方已声明,会出现函数提升
fn2()
function fn2 (){
   console.log("fn2()")
}

3、 表达式定义的不遵循函数提升

通过function定义(声明)的函数,在之前就可以调用,不是函数声明的方式定义的函数不遵循函数提升
值:函数定义(对象)

// fn3() 不可以调用执行,下方是通过var声明变量的方式定义变量,不关心值是多少,遵循的的是变量提示
// 此时fn3还是undefined 并不是可以执行的函数
fn3()
var fn3 = function(){
   console.log("fn3")
}

注:
function add(){}这种写法叫做函数声明
var add=function(){}这种写法叫做函数表达式
function(){}这种是匿名函数

f1();//输出结果:123
f2();//Uncaught TypeError: f2 is not a function
function f1(){
    console.log("123");
}
var f2 = function(){
    console.log("f2");
}

实际上执行过程

function f1(){
   console.log("123");
}// 函数提升,整个代码块提升到函数作用域的最顶端
f1();
f2();
var f2 = function(){
    console.log("f2");
}
Logo

前往低代码交流专区

更多推荐