2014-12-09 3 views
2

У меня есть библиотека, которая работает в (function() { ... })(); схеме ...Вызов функции из библиотеки, вне библиотеки

// mylibrary.js 
(function() { 
    function myfunc() { alert('hello'); }; 

    if (...) 
     return; 

    // do something 

})(); 

... что я использую в HTML страницу:

<!DOCTYPE html> 
<html lang="en"> 
<body> 
    <div>Bonjour</div> 

    <script src="mylibrary.js"></script> 

    <script> 
    myfunc(); // scope error ! 
    </script> 

</body> 
</html> 

Как позвонить функции myfunc()за пределами библиотеки? Должен ли я изменить схему (function() { ... })();? (что я имел обыкновение делать return внутри библиотеки)

Что является наиболее распространенной практикой?

+0

Это библиотека, о которой я говорю (она моя, и ее нужно улучшить, конечно!): Https://github.com/josephernest/bigpicture.js/blob/master/bigpicture.js – Basj

+2

как написано, вы не можете. вы можете опубликовать функции, необходимые для окна, внутреннего объекта или использовать экспортер-экспортер bsed, например commonJS – dandavis

+0

@ dandavis. Какая наиболее распространенная практика? (Я бы хотел избежать сторонних инструментов/библиотек для экспорта)? – Basj

ответ

1

Вы хотите Revealing Module Pattern:

var module = (function() { // Self invoking function 
    var privateVariable = 42; // This variable is private to the module. 
    var publicFunction = function() { console.log(42); } // Still not public 

    return { 
     myPublic: publicFunction // Now it is, notice optional the name change! 
    } 
})(); //Call itself. 

module.myPublic(); // Call by the new name. 

В этом случае функция выполняется и возвращается объект (так module теперь является объект), и вы просто вызываете функции, являющиеся членами этого объекта.

+0

Спасибо @SecondRikudo за то, что ознакомил меня с темой шаблонов. Считаете ли вы, что этот вариант верен: http://stackoverflow.com/questions/27397099/slight-variation-of-the-revealing-module-pattern? – Basj

-1

Если вы имеете в виду для вас работать, чтобы быть доступны по всему миру, то вы можете присвоить его window объекту:

window.myfunc = myfunc; 

Это то, что делает Mixpanel:

http://cdn.mxpnl.com/libs/mixpanel-2-latest.js

+0

Нет. Добавьте одно свойство глобальному объекту (т. Е. Пространство имен), через которое осуществляется доступ к библиотеке. – orb

+0

В какой строке http://cdn.mxpnl.com/libs/mixpanel-2-latest.js есть экспорт с 'window'? – Basj

+0

Можете ли вы объяснить, какой глобальный объект вы говорите о @orb? Может быть, вы можете дать ответ? Эти термины (namespace, свойство для глобального объекта еще не ясны для меня) – Basj

1

здесь как вы должны это делать.

var myApp = (function() { 
 
    var stuff = []; //private 
 

 
    return { //exposed to public 
 
    myfunc: function(values) { 
 
     alert('You said: ' + values); 
 
    } 
 
    } 
 
}()); 
 

 
myApp.myfunc('Test Me');

+0

Чтобы улучшить организацию моего кода/библиотеки, можете ли вы указать, какая часть кода должна быть библиотекой, как вызвать библиотеку из HTML и т. Д.? Спасибо заранее @ Born2Code! – Basj

Смежные вопросы