Частные функции в JavaScript - PullRequest
6 голосов
/ 19 ноября 2010

В веб-приложении на основе jQuery у меня есть различные сценарии, в которые может быть включено несколько файлов, и я использую только один из них одновременно (я знаю, что не все из них были бы лучше, но я просто отвечаюдля JS, так что это не мое решение).Поэтому я обертываю каждый файл в функцию init<i>Module</i>(), которая регистрирует различные события и выполняет некоторую инициализацию и т. Д.

Теперь мне любопытно, есть ли различия между следующими двумя способами определения функций, не загромождающихглобальное пространство имен:

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 */
}

Ответы [ 2 ]

8 голосов
/ 19 ноября 2010

Основное различие между этими двумя подходами заключается в том, когда функция становится доступной.В первом случае функция становится доступной после объявления, но во втором случае она доступна во всей области видимости (она называется подъем ).

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

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

, кроме этого - они в основномто же самое.

0 голосов
/ 19 ноября 2010

это модель, которая помогла мне управлять модулями в 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({});
...