Вы не можете .
JavaScript не имеет никакого понятия о модификаторах доступа (кроме export
в модуле, но элементы <script>
со встроенными сценариями не JavaScript модулей).
Кроме того, модификатор private
в языках OOP имеет смысл только для типов class
/ struct
, но не free-functions (поскольку все свободные функции имеют глобальную область видимости), поэтому идея private function myFunction() { ... }
не имеет смысла.
В настоящее время в экосистеме JavaScript при работе с JavaScript class
(который это просто syntacti c sugar для prototype
декларации) обычно принято обозначать «частные» свойства (включая функции) с помощью начального подчеркивания - но это соглашение, а не языковая функция, и при этом она не препятствует функции вызывается из другого скрипта:
class Foobar {
doSomething() { // <-- "public"
// ...
}
_doSomethingElse() { // <-- the leading underscore is a hint to consumers not to use this property directly, but they can still call it if they want to.
// ...
}
}
var f = new Foobar();
f.doSomething();
f._doSomethingElse(); // <-- nothing stops a consumer from calling this function-property.
Обходной путь:
Обратите внимание, что может иметь JavaScript объект (используя class
или просто POJO) с недоступными анонимными функциями при условии, что вы можете подключить их способ, который не раскрывает их - но недостатком этого подхода является то, что ваш собственный код также не может напрямую вызывать их. Этот подход можно использовать для настройки обработчиков событий без загрязнения глобального пространства имен:
class Foobar {
constructor() {
(function() { // This is an IIFE
const button = document.getElementById( 'foobar' );
button.addEventListener( 'click', function() {
alert("clicked!);
} );
})();
}
}
В приведенном выше коде функции IIFE и click
теперь не могут вызываться напрямую, поскольку они не У него нет имени, и после запуска скрипта он не будет находиться в области видимости.