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內部變量的作用。