JavaScript Function 两种声明形式
- 函数声明
function 函数名 ([参数]) {[函数体]}
// 例子:
function func () {
console.log('func');
}
- 函数表达式
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