首先我们知道,函数定义有两种常见的方式,函数声明和函数表达式。
// 函数声明
function fun() {
console.log(123);
}
// 函数表达式
var f = function() {
console.log(456);
}
函数声明可以进行函数提升,函数表达式不可以。
接下来说一下立即调用的事。看以下代码:
// 代码一:
function fun() {
console.log(123);
}
fun();
// 代码二:
var a = function() {
console.log(123);
}();
// 代码三:
function fun() {
console.log(123);
}()
分别打印出:
// 123
// 123
// Uncaught SyntaxError: Unexpected token ‘)’
结果:代码三报错了
分析: 函数在定义的时候是不会执行的,我们要手动去调用执行,用函数表达式 + ()
的方法去执行。
- 代码一中 fun的函数名在这里就是函数表达式,所以
函数表达式 + ()
就是fun()。 - 代码二中 var a = function() { console.log(123); }是一个函数表达式,所以后面可以直接跟()去调用执行函数。
- 代码三中 function fun() { console.log(123); }是函数声明,并不是函数表达式,所以后面不能直接跟() 调用
再接着看这段代码:
(function fun() {
console.log(123);
})()
结果: // 123
分析:在js中,把函数声明转化为函数表达式的方法可以为,函数声明前面加上 +,-,~ 或 ! 等运算符或者 () 包起来。所以,(function fun() { console.log(123); })返回的就是函数表达式,而不是函数声明,所以后面可以跟 () 进行调用执行。
(function fun() {
console.log(123);
})()
+function fun() {
console.log(123);
}()
-function fun() {
console.log(123);
}()
~function fun() {
console.log(123);
}()
!function fun() {
console.log(123);
}()
结果: 全部输出 123