JavaScript中的私有函数

6
在一个基于jQuery的Web应用程序中,我有各种脚本,可能包含多个文件,但我每次只使用其中一个文件(我知道不包括所有文件会更好,但我只负责JS,所以这不是我的决定)。因此,我将每个文件都包装在一个initModule()函数中,该函数注册各种事件并进行一些初始化等操作。
现在我很好奇以下两种定义函数的方式是否有任何区别,以避免全局命名空间的混乱:
function initStuff(someArg) {
    var someVar = 123;
    var anotherVar = 456;

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

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

    /* do some stuff here */
}

并且

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

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

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

    /* do some stuff here */
}

请看这个问题:https://dev59.com/8HNA5IYBdhLWcg3wUL_n。 - jwueller
2个回答

8
这两种方法的主要区别在于函数何时可用。在第一种情况下,函数在声明后可用,而在第二种情况下,在整个范围内都可用(这称为提升)。
function init(){
    typeof privateFunc == "undefined";
    var privateFunc = function(){}
    typeof privateFunc == "function";
}

function init(){
    typeof privateFunc == "function";
    function privateFunc(){}
    typeof privateFunc == "function";
}

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

3
唯一的另一个差别是,与函数表达式创建的函数不同,通过函数声明创建的函数有一个名称,在某些浏览器中会在函数的字符串表示中显示出来,这对于调试很有帮助。函数名称还会在某些浏览器中的函数对象的 name 属性中显示出来。 - Tim Down
函数声明设置函数的名称属性,但是这种行为未被任何标准定义,而且在不同浏览器之间支持不佳,因此不能依靠它。但是指出的要点是正确的——这是函数语句和声明之间的区别。 - Andris
为了更清晰地表达,这是因为函数声明被“提升”(引号是因为它比简单的移动声明要复杂一些),就像变量声明一样。当使用函数表达式时,只有变量声明部分被提升。 - Matt

0

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

base.js:

var mod = {};

mod.functions = (function(){

    var self = this;

    self.helper1 = function() {

    } ;

    self.helper2 = function() {

    } ;

    return self;

}).call({});

module_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({});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接