先理解一些函数的基本概念:函数声明、函数表达式、匿名函数。
函数声明:使用function关键字声明一个函数,再指定一个函数名。
function fnName(){}
函数表达式:使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量。
这是最常见的函数表达式语法形式。
var fnName = function(){}
匿名函数:使用function关键字声明一个函数,但未给函数命名。匿名函数属于函数表达式。
function(){}
函数声明和函数表达式不同之处在于:
1、JavaScript引擎在解析JavaScript代码时会“函数声明提升”当前执行环境(作用域)上的函数声明,而函数表达式必须等到JavaScript引擎执行到它所在行时,才会从上而下一行一行的解析函数表达式
2、函数表达式后面可以加括号立即调用该函数;函数声明不可以,只能以fnName()形式调用。
立即执行函数:创建一个匿名函数并执行,在一次执行后即释放(销毁)。
立即执行函数常见的两种方式:
1、一个匿名函数后面跟个小括号,然后整个包裹在一个括号运算符中:
(function(){}())
这也是W3C标准推荐的一种写法。
2、一个匿名函数包裹在一个括号运算符中,后面再跟个小括号:
(function(){})()
除了使用()运算符之外,!, +, -, ~, = 等运算符都能起到立即执行的作用。这些运算符的作用就是将匿名函数或函数声明转换为函数表达式,消除了JavaScript引擎识别函数表达式和函数声明的歧义,告诉JavaScript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。如下面的函数都是立即执行函数:
(function(param){
console.log(param); //a
}('a'));
(function(param){
console.log(param); //b
})('b');
!function(param){
console.log(param); //c
}('c');
+function(param){
console.log(param); //d
}('d');
-function(param){
console.log(param); //e
}('e');
~function(param){
console.log(param); //f
}('f');
void function(param){
console.log(param); //g
}('g');
new function(param){
console.log(param); //h
}('h');
var fn = function(param){
console.log(param); //i
}('i');
注意:加括号是最安全的做法,因为 !, +, -, ~ 等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。
使用立即执行函数的好处:
通过定义一个匿名函数,创建了一个新的函数作用域,相当于创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏污染全局的命名空间。此时若是想访问全局对象,将全局对象以参数形式传进去即可,如jQuery代码结构:
(function(window, undefined){
//jquery code
})(window);
其中window即是全局对象。