函数声明与函数表达式

274 阅读2分钟

函数声明

1.通过function 指令来声明函数

function fun(){
    let name = "Jason"
    return name;
}

2.在函数通过任何指令声明的变量都不可被外包访问

function fun(){
    let name = "Jason"
    return name;
}
console.log(name)  //  ReferenceError: name is not defined

3.函数可以访问外部变量

let name = "Jason"
function fun(){
    console.log(name)
}
fun()        // "Jason"

4.函数提升

fun()          // Jason

function fun(){
    let name = "Jason"
    return name;
}

函数表达式

1.函数表达式的创建过程

let fun = function(){
    let name = "Jason"
}

fun()
  1. 在内存中声明创建一个匿名函数
  2. 将该匿名函数赋值给变量
  3. 通过fun()调用匿名函数

2.函数表达式的匿名函数可访问外包部变量

let name  = "Jason"
let fun = function(){
    console.log(name)
}
fun()            // "Jason"

3.函数表达式中匿名函数中变量不可以被外部访问

let fun = function(){
    let name = "Jason";
    console.log(name);
}

console.log(name);   // ReferenceError: name is not defined
fun();          // "Jason"

4.函数表达式不能发生提升。

fun()             // ReferenceError: Cannot access 'fun' before initialization
let fun = function(){
    console.log("Jason");
}

函数声明与函数表达式的区别

如上可得知函数申明与函数表达式大致都是相同的就是函数声明为什么可以发生函数提升,而函数表达式就不行呢,这就关系到了函数是在何时创建的问题了。

let fun = function(){}

上面的函数表达式是一个赋值表达式只有当代码运行到该表达式的时候才进行函数的创建,创建会才赋值给变量,也就是说该表达式之前还未创建函数,所以调用会报错。

function fun(){}

上述中函数表达式在代码运行到表达式时才去创建函数,那函数声明是什么时候创建的函数呢,其实由于内部算法的原因,JavaScript在准备脚本的时候也就是”初始化阶段“时会去搜索全局中的函数声明,并去创建函数。所以在初始化阶段函数被创建了,而在脚本中函数不管在哪里去调用时都不会报错,因为函数创建总是会在函数调用之前。