Частные функции в JavaScript
В веб-приложении на основе jQuery у меня есть различные сценарии, в которые могут быть включены несколько файлов, и я использую только один из них за раз (я знаю, что не все из них были бы лучше, но я просто отвечаю за 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 */
}
2 ответа
Основное различие между этими двумя подходами заключается в том, что когда функция становится доступной. В первом случае функция становится доступной после объявления, но во втором случае она доступна во всей области видимости (это называется подъемом).
function init(){
typeof privateFunc == "undefined";
var privateFunc = function(){}
typeof privateFunc == "function";
}
function init(){
typeof privateFunc == "function";
function privateFunc(){}
typeof privateFunc == "function";
}
кроме этого - они в основном одинаковы.
Это модель, которая помогла мне управлять модулями в 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({});