【笔记08】Javascript - 立即执行函数

函数分两种定义方式

function demo (){}          // 函数声明
var demo = function (){} // 函数表达式

还有一种定义的方式,甚至没有给函数取名字,定义完之后,不用去调用它,他就能执行。

(function (){
console.log("123"); // 123
}())

这种函数就叫: 立即执行函数


立即执行函数

立即执行函数的特点是,定义完,读到这,立即执行,执行完后,立即销毁函数本身。

一般的全局函数长这样:

function test(){
console.log("abc");
}
test();

这样定义的全局函数,调用执行完后,不会消失,等待被执行,占用内存。

如果函数只想执行一次,又不想浪费空间,怎么办? 立即执行函数。

立即执行函数,执行完后,销毁了,找不到了,就算取了名字,也找不到了。

(function demo(){
console.log("abc");
}())

在控制台引用时报错:

Javascript(笔记08) - 函数 - 立即执行函数_javascript

既然取了名字也找不到,就不用取名字,很任性。

立即执行函数除了不能反复被调用外,跟基本函数没有区别;

语法:

(function (){}());          //常用方法
(function (){})(); //不常用

传参数:

(function (a, b){
console.log(a + b); //3
}(1, 2))

返回值:常用于初始化数据

var num = (function (a, b){
return a + b;
}(1, 2))

原理:只有表达式才能被执行

// 函数声明
function test (){ // ... }
// 只有变成表达式后才能执行
test(); // 表达式 ()代表执行符

// 函数表达式
var demo = function(){ // ... }

示例1:给函数声明后加个执行符"()",能执行函数么?

function test(){
console.log("a");
}();

这样不行,会报错:

Javascript(笔记08) - 函数 - 立即执行函数_javascript_02

示例2:给函数声明加上转换符(或叫运算符) "+" / "-" / "!",函数能被执行么?

+ function test(){
console.log("a");
}(); // a 函数能执行了

加上转换符后,函数声明整体变成表达式了,这样函数就能执行了,加上 “-” 和 "!" 也是可以的。

示例3:给函数声明加上"()",这也是运算符,那函数能被执行么? 

(function test(){
console.log("a");
})(); // a 也能执行,跟上面不推荐使用的写法一样了

运算符“()”括号也能把函数声明变成表达式,表达式才能执行。所以,这样看,立即执行函数是变化推导而来,不是定义出来的。那为什么常用写法里把执行"()"放在函数声明里面也可以执行?因为外面的运算符“()”的优先级更高,函数声明变成表达式了。