自执行匿名函数
立即执行的函数表达式
闭包
// 下面2个括弧()都会立即执行 (function () { /* code */ } ()); // 推荐使用这个 (function () { /* code */ })(); // 但是这个也是可以用的
// 由于括弧()和JS的&&,异或,逗号等操作符是在函数表达式和函数声明上消除歧义的 // 所以一旦解析器知道其中一个已经是表达式了,其它的也都默认为表达式了 // 不过,请注意下一章节的内容解释 var i = function () { return 10; } (); true && function () { /* code */ } (); 0, function () { /* code */ } ();
自执行匿名函数和立即执行的函数表达式区别
我们一直叫自执行函数,确切的说是自执行匿名函数,但英文原作者一直倡议使用立即调用的函数表达式
// 这是一个自执行的函数,函数内部执行自身,递归 function foo() { foo(); } // 这可能也是一个自执行的匿名函数,仅仅是foo标示名称引用它自身 // 如果你将foo改变成其它的,你将得到一个used-to-self-execute匿名函数 var foo = function () { foo(); }; //有些人叫这个是自执行的匿名函数(即便它不是),因为它没有调用自身,它只是立即执行而已。 (function () { /* code */ } ()); // 为函数表达式添加一个标示名称,可以方便Debug // 但一定命名了,这个函数就不再是匿名的了 (function foo() { /* code */ } ()); // 立即调用的函数表达式(IIFE)也可以自执行,不过不常用罢了 (function foo() { foo(); } ());Module模式
var counter = (function () { var i = 0; return { get: function () { return i; }, set: function (val) { i = val; }, increment: function () { return ++i; } }; } ());counter.get(); // 0 counter.set(3); counter.increment(); // 4 counter.increment(); // 5