(转)理解javascript中的立即执行函数(function(){})()

作者 Zhendong Ho 日期 2019-04-25
(转)理解javascript中的立即执行函数(function(){})()

之前看了好多代码,都有用到这种函数的写法,但是都没认真的去想为什么会这样写,今天开始想学习下jquery的源码,发现jquery也是使用这种方式,用(function(window, undefined){})(window)包裹内部代码,于是进一步的去学习了下。

要理解立即执行函数(function(){})(),先了解些函数的基本概念(函数声明、函数表达式、匿名函数)

函数声明

使用function声明函数,并指定函数名。

function setFn() {
// coding
}

函数表达式

使用function声明函数,但未指定函数名,将匿名函数赋予一个变量。

var setFn = function() {
// coding
}

匿名函数

使用function关键字声明函数,但未指定函数名。

function() {
// coding
}

匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。

函数声明和函数表达式区别

函数声明可在当前作用域下提前调用执行,函数表达式需等执行到该函数后,方可执行,不可提前调用

setFn();
function setFn() {
// coding
}
//正常,函数声明可以提前调用

setFn();
var setFn = function() {
// coding
}
//报错,setFn未保存对函数的引用,函数调用需放在函数表达式后面

函数表达式可直接在函数后加括号调用

var setFn = function() {
// coding
} ()
//加括号直接调用

立即执行函数

立即执行函数里面的函数必须是函数表达式,所以由var setFn = function() { } () 可以理解为在匿名函数前加了 = 运算符后将函数声明转发为函数表达式,所以拿 ! ,+,-,( ) 等运算符来测试下是否如此。

!function() {
console.log(1);
} ();
//1

+function() {
console.log(2);
} ();
//2

-function() {
console.log(3);
} ();
//3

(function() {
console.log(4);
}) ();
//4

由此可见,加运算符确实可将函数声明转化为函数表达式,而之所以使用括号,是因为括号相对其他运算符会更安全,可以减少不必要的麻烦。

立即执行函数与正常函数传参形式是一致的。

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

(function(){})() 这样写的好处是,在内部定义的变量不会跟外部的变量有冲突,达到保护内部变量的作用。