JS十大难点一

立即执行函数

什么是立即执行函数

立即执行函数,正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作
正常函数

1
2
var fun = function(){};
fun(); // 立即执行

立即执行函数

1
(function(){})(); // 立即执行

function(){…}是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。
立即执行函数也可以理解为立即调用一个匿名函数。
立即执行函数最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突

声明函数和匿名函数

无论是构造函数,函数表达式还是函数声明,它们都需要一个函数的名字,这是声明函数;
匿名函数是指一个函数没有名字,并且被立刻调用,立即执行函数就是匿名函数,即使它的可以起名字的,但是这个函数名没有任何意义

立即执行函数的常用写法

用小括号包裹整个函数体,然后在后面再添加一个小括号进行调用

1
(function(){})()

用小括号包含整个函数体,并且包含用以调用的小括号

1
(function(){}())

用+运算符链接函数体

1
+function(){}()

立即执行函数是运算符和函数的结合

无论是小括号又或者是+号都是运算符,将它们与函数进行连接后,就是立即执行函数
-运算符

1
2
-function(a){return a}(100)
-100

=运算符

1
2
fn = function(a){return a}(100)
100

!运算符

1
2
!function(a){return a}(100)
false

,运算符

1
2
0,function(a){console.log(a)}(100)
100

立即执行函数其实是一个表达式,不会受到函数声明前置的影响

1
2
3
var a = 100;
(function(e){console.log(e)}(a))
// 100

该函数是在a被赋值为100后才被创建并执行的

立即执行函数的作用

立即执行函数的作用主要是防止变量的污染,在函数自身内部创建一个局部作用域
所有在该函数内部创建的变量都会在执行后被销毁,对外部变量没有影响