立即执行函数模式是一种语法,可以让你的函数在定义后立即被执行,比如:
(function () {
alert('watch out!');
}());
这种模式有一些几部分组成:
使用函数表达式定义一个函数(函数声明不能起作用)在结尾加上一对括号,让函数立即被执行
将整个函数包裹在一对括号中(只有在你不将函数赋值给一个变量的时候才需要)
立即执行函数的参数
// prints:
// I met Joe Black on Fri Aug 13 2010 23:26:59 GMT-0800 (PST)
(function(who, when) {
console.log("I met " + who + " on " + when);
} ("Joe Black", new Date()));
通常,全局变量被作为一个参数传递给立即执行参数,这样它在函数内部不使用window也可以被访问到:这种方式可以让代码在环境中更加通用:
(function (global) {
}(this));
立即执行函数的返回值
就像其它任何函数一样,一个立即执行函数也能返回值并且可以复制给其它变量:
var result = (function () {
return 2 + 2;
}());
另外一种实现相同的功能的方法是省略包裹函数的括号,因为当你将立即执行函数的返回值赋值给一个变量时它们不是必需的;
var result = function () {
return 2 + 2;
}();
如果没有注意到函数结束的括号,一些人可能就会认为result指向一个函数;
实际上result指向立即执行函数的返回值,在这种情况下是数字 4 。
在前面的例子中返回一个基本类型的整数作为立即执行函数的返回值;
但是除了基本类型值,立即执行函数也能返回任何类型的值,包括其它的函数,那么就可以利用立即执行函数的作用域为返回的内部函数私下里存储一些数据。
var foo= (function() {
var res = 2 + 2;
return function() {
return res;
};
} ());
立即执行函数的返回值是一个函数——被赋值给了变量foo,这个函数简单的返回了res的值