JavaScript中的私有函数

JavaScript中的私有函数,javascript,scope,private-functions,Javascript,Scope,Private Functions,在基于jQuery的web应用程序中,我有各种脚本,其中可能包含多个文件,我一次只使用其中一个(我知道不包含所有文件会更好,但我只负责JS,所以这不是我的决定)。因此,我将每个文件包装在一个initModule()函数中,该函数注册各种事件并执行一些初始化等操作 现在,我很好奇以下两种定义函数的方法是否有任何区别,它们不会使全局名称空间变得混乱: function initStuff(someArg) { var someVar = 123; var anotherVar = 4

在基于jQuery的web应用程序中,我有各种脚本,其中可能包含多个文件,我一次只使用其中一个(我知道不包含所有文件会更好,但我只负责JS,所以这不是我的决定)。因此,我将每个文件包装在一个
initModule()
函数中,该函数注册各种事件并执行一些初始化等操作

现在,我很好奇以下两种定义函数的方法是否有任何区别,它们不会使全局名称空间变得混乱:

function initStuff(someArg) {
    var someVar = 123;
    var anotherVar = 456;

    var somePrivateFunc = function() {
        /* ... */
    }

    var anotherPrivateFunc = function() {
        /* ... */
    }

    /* do some stuff here */
}


这两种方法之间的主要区别在于函数何时可用。在第一种情况下,函数在声明后可用,但在第二种情况下,它在整个范围内都可用(称为提升)


除此之外,它们基本相同。

这是一个帮助我管理javascript模块的模型:

base.js:

var mod = {};

mod.functions = (function(){

    var self = this;

    self.helper1 = function() {

    } ;

    self.helper2 = function() {

    } ;

    return self;

}).call({});
模块_one.js

mod.module_one = (function(){

  var 
    //These variables keep the environment if you need to call another function
    self = this, //public (return)
    priv = {};   //private function

  priv.funA = function(){
  }

  self.somePrivateFunc = function(){
     priv.funA();
  };

  self.anotherPrivateFunc = function(){

  };

  // ini module

  self.ini = function(){

     self.somePrivateFunc();
     self.anotherPrivateFunc();

  };

  // ini/end DOM

  $(function() {

  });

  return self; // this is only if you need to call the module from the outside
               // exmple: mod.module_one.somePrivateFunc(), or mod.module_one.ini()

}).call({});

看一看。唯一的另一个区别是,与函数表达式创建的函数不同,函数声明创建的函数有一个名称,在某些浏览器中会显示在函数的字符串表示形式中,这有助于调试。在某些浏览器中,函数名也显示在函数对象的
name
属性中。函数声明设置函数的name属性,但这种行为没有任何标准定义,在不同的浏览器中不受支持,因此无法依赖。但所提出的观点是正确的——这是函数语句和声明之间的区别。为了进一步澄清,这是因为函数声明与变量声明非常类似,是“被提升的”(引用,因为它比简单地移动声明更复杂)。使用函数表达式时,仅提升变量声明部分。
var mod = {};

mod.functions = (function(){

    var self = this;

    self.helper1 = function() {

    } ;

    self.helper2 = function() {

    } ;

    return self;

}).call({});
mod.module_one = (function(){

  var 
    //These variables keep the environment if you need to call another function
    self = this, //public (return)
    priv = {};   //private function

  priv.funA = function(){
  }

  self.somePrivateFunc = function(){
     priv.funA();
  };

  self.anotherPrivateFunc = function(){

  };

  // ini module

  self.ini = function(){

     self.somePrivateFunc();
     self.anotherPrivateFunc();

  };

  // ini/end DOM

  $(function() {

  });

  return self; // this is only if you need to call the module from the outside
               // exmple: mod.module_one.somePrivateFunc(), or mod.module_one.ini()

}).call({});