1. 传统的方法定义(声明)并执行如下:
function foo() {...} // 这是定义 ;定义只是让解释器知道其存在,但是不会运行。
foo(); // 这是语句 ;解释器遇到语句是会运行它的。
注:(1)传统的方法比较繁琐,定义(声明)和执行分开 ; (2)传统的方法直接污染全局命名空间 。
2. 目前比较流行的方法定义如下:
function foo() {...})();
或者
(function foo(){...}());
3. 另外,上面的写法外,还有很多别的写法,比如:
!function foo() {...}();
或者
+function foo() {...}();
这些都可以.即:+function (){} 或 !function foo(){}这个等于 (function (){})。
*总结
a. (function(){})(); 是 把函数当作表达式解析,然后执行解析后的函数;相当于 var a = function(){}; a(); a得到的是函数。
b. (function(){}()); 是把函数表达式和执行当作语句直接执行;相当于 var a = function(){}(); a得到的是结果。
以上两种方式的最终结果是一样的。
c. 一般用(function (){}) 有个作用,就是避免全局变量;()只是起了 自执行的作用。
注:所谓不去污染全局命名空间,是因为以上两种定义方法创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。
如果你需要全局对象,就传递参数如下:
void function (global) {
// 在这里,global 就是全局对象了
}(this) // 在浏览器里,this 就是 window 对象