我最近读了很多Javascript,我注意到整个文件在要导入的.js文件中是像下面这样包装的。

(function() {
    ... 
    code
    ...
})();

为什么要这样做而不是简单的构造函数集呢?


当前回答

它被称为OOP中的封装。

其他回答

提供一个接受的答案的例子,从https://requirejs.org/docs/whyamd.html:

(function () {
    var $ = this.jQuery;

    this.myExample = function () {};
}());

代码演示了我们可以:

在作用域中使用全局变量 导出函数、变量等。通过绑定this,也就是浏览器的窗口对象。

这叫做闭包。它基本上将代码密封在函数内部,这样其他库就不会干扰它。这类似于在编译语言中创建名称空间。

的例子。假设我这样写:

(function() {

    var x = 2;

    // do stuff with x

})();

现在,其他库无法访问我在我的库中创建的变量x。

浏览器中的Javascript只有两个有效作用域:函数作用域和全局作用域。

如果一个变量不在函数作用域中,它就是在全局作用域中。全局变量通常是不好的,所以这是一个构造,以保持库的变量本身。

你也可以在更大的表达式中使用函数闭包作为数据,就像在这个方法中确定浏览器对某些html5对象的支持一样。

   navigator.html5={
     canvas: (function(){
      var dc= document.createElement('canvas');
      if(!dc.getContext) return 0;
      var c= dc.getContext('2d');
      return typeof c.fillText== 'function'? 2: 1;
     })(),
     localStorage: (function(){
      return !!window.localStorage;
     })(),
     webworkers: (function(){
      return !!window.Worker;
     })(),
     offline: (function(){
      return !!window.applicationCache;
     })()
    }

除了保持变量在本地之外,一个非常方便的用法是在使用全局变量编写库时,可以给它一个更短的变量名,以便在库中使用。它经常用于编写jQuery插件,因为jQuery允许您使用jQuery. noconflict()禁用指向jQuery的$变量。如果它被禁用,你的代码仍然可以使用$,如果你只是这样做:

(function($) { ...code...})(jQuery);