JavaScript 函数声明及函数表达式

423 阅读2分钟

JavaScript Function 两种声明形式

  1. 函数声明
function 函数名 ([参数]) {[函数体]}
// 例子:
function func () {
    console.log('func');
}
  1. 函数表达式
let 变量名 = function [函数名] ([参数]) {[函数体]}
// 例子 1:
let f = function func () {
    console.log('func');
};
// 例子 2:
(function func () {
    console.log('func')
})()

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

一、函数声明提升到顶部

函数声明提升到顶部,即声明在作用域内位置不影响代码运行结果。在作用域内任何地方都能调用通过“函数声明”声明的函数。 但使用“函数表达式”声明函数时,只能在函数声明语句后才能调用该函数。 以下是一些例子:

// 例子 1:函数声明
test()    // 输出 'test'
function test () {
    console.log('test')
}
// 例子 2:函数表达式
test()    // 报错:test is not a function
var test = function test () {
    console.log('test')
}
// 例子 3:覆盖
func()    // 输出 'func2',按照函数声明顺序覆盖
var func = function func () {console.log('var')}
function func () {console.log('func1')}
function func () {console.log('func2')}
func()    // 输出 'var',“函数声明”的函数被现行定义,后运行至“函数表达式”时将“函数声明”覆盖

二、函数表达式可以立即执行,但函数声明不可以

// 函数表达式
var func = function () {console.log('func')} ()    // 输出 'func'
// 函数声明
function func () {console.log('func')} ()    // 语法错误

三、作用域的区别

函数声明:在函数内外均可通过函数名称访问函数

// 正常运行
function test () {
    console.log(typeof test)
}
test()

函数表达式: 函数外无法通过函数名称访问函数,只能通过变量名访问。 但函数内部可以通过函数名称访问。

var f = function func () {
    console.log(typeof func)
}
f()    // 输出 'function'
func()    // 报错:func is not a function