为什么jQuery将自己包装在一个函数中?

Chr*_*oyd 14 javascript jquery

我正在阅读jQuery源代码,我想知道为什么整个源文件都包含在一个自治函数中.

(function(){
  ...
})();
Run Code Online (Sandbox Code Playgroud)

这有助于不污染全局命名空间吗?它为什么存在,它是如何工作的?

oll*_*iej 21

它使用函数体提供自己的范围,而不是引入大量可能被外部代码意外更改的全局变量.

例如.

(function (){
    var someConstantValue = ...;
    myCoolFunction = function(){ return someConstantValue * 5; }
})();

myCoolFunction();
Run Code Online (Sandbox Code Playgroud)

如果未引入功能范围,则可能someConstantValue通过引入其他代码(或其他库)而意外更改

someConstantValue = someOtherValue; // this won't change the behaviour of myCoolFunction
Run Code Online (Sandbox Code Playgroud)


Mat*_*aim 6

你是对的,它可以防止污染全局命名空间.

jQuery需要的所有变量和函数都是在该函数内部创建的,这使得这些函数和变量不会流入全局命名空间.如果你看一下这段代码:

var jQuery = window.jQuery = window.$ = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context );
};
Run Code Online (Sandbox Code Playgroud)

它实际上是通过将window.jQuery和window.$设置为初始化函数将jQuery初始化程序连接到外部世界.这是包装函数内部变量直接在包装器外部可用的唯一位置.

另请注意,整个函数都包含这样(函数,,,)(),它将在文件加载后立即执行该函数.