JavaScript中任何库与框架设计的第一个要点就是解决命名空间与变量污染的问题。jQuery就是利用了JavaScript函数作用域的特性,采用自执行函数包裹了自身的方法来解决这个问题。从jQuery不同的版本中可以看出它的自执行函数有如下两种写法:
1 // 写法一
2 (function(window, factory) {
3 factory(window)
4 }(this, function() {
5 return function() {
6 //jQuery的调用
7 }
8 })); // 其实写法一可以看成是(function() {}());
9
10 // 写法二
11 (function(window, undefined) {
12 var jQuery = function() {}
13 // ...
14 window.jQuery = window.$ = jQuery;
15 })(window); // 而写法而可以看成是(function() {})();
采用这种写法的意义
JavaScript中没有私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉。根据JavaScript函数作用域链的特性,可以使用这种技术模仿一个私有作用域,把匿名函数作为一个“容器”,内部可以访问外部的变量,而外部环境不能访问内部。从而达到保护jQuery内部变量的作用。