2010-11-19 2 views
6

В веб-приложении на основе jQuery у меня есть различные сценарии, в которых могут быть включены несколько файлов, и я использую только один из них (я знаю, что не включая все из них было бы лучше, но я Я просто отвечаю за JS, так что это не мое решение). Поэтому я оборачивать каждый файл в initModule() функции, которая регистрирует различные события и делает некоторые инициализации и т.д.Частные функции в JavaScript

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

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

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript). – jwueller

ответ

8

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

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

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

кроме этого - они в основном одинаковы.

+3

Единственное отличие состоит в том, что в отличие от функции, созданной функцией exprerssion, функция, созданная объявлением функции, имеет имя, которое будет отображаться в строчном представлении функции в некоторых браузерах, что может помочь при отладке. Имя функции также отображается в свойстве 'name' объекта функции в некоторых браузерах. –

+0

Объявление функции задает свойство имени функции, но это поведение не определяется никаким стандартом, плохо поддерживается среди разных браузеров и, следовательно, нельзя полагаться. Но точка сделана правильно - это разница между заявлением функции и объявлением. – Andris

+0

Для большей ясности это связано с тем, что объявление функции «поднято» (кавычки, потому что это немного сложнее, просто перемещая объявление), подобно объявлениям переменных. При использовании выражения функции поднимается только часть объявления переменных. – 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({}); 
Смежные вопросы