【函数提升——函数声明与函数表达式】

1,712 阅读1分钟

引言

当我们日常开发时,函数声明和函数表达式很常见,
那他们到底有啥区别呢?

函数声明(ES6)

function declare(val) {
    return val;
}

变量提升:函数声明会被提升到作用域的最前面

函数表达式(ES5)

var expression = function (val) {
    return val;
}

不存在变量提升,在引用的时候才解析函数,表达式赋值完成后才能调用
变量本身不做为一个函数存在,而是一个匿名函数的引用(值类型的不属于引用)

例子

console.log(f1()); // 输出:declare

var f1 = function () {
    return 'expression';
}

console.log(f1()); // 输出:expression

function f1() {
    return 'declare';
}

总结

Javascript中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。 所以,函数声明和函数表达式如果同名。由于函数声明的提升,函数表达式就会覆盖掉原来的函数声明。