javascriptprivate-functions

Javascript Private Function Assistance


I am having a problem grasping how to make javascript functions/variables private. How would I need to edit this to make the functions/variables private in something like this.

<html>
<head>
<style>
#panel, .flip {
  font-size: 16px;
  padding: 10px;
  text-align: center;
  background-color: #4CAF50;
  color: white;
  border: solid 1px #a6d8a8;
  margin: auto;
}

#panel {
  display: none;
}
</style>
</head>
<body>

<p class="flip" onclick="myFunction()">Click to show panel</p>

<div id="panel">
  <p>This panel contains a div element, which is hidden by default (display: none).</p>
  <p>It is styled with CSS and we use JavaScript to show it (display: block).</p>
  <p>How it works: Notice that the p element with class="flip" has an onclick attribute attached to it. When the user clicks on the p element, a function called myFunction() is executed, which changes the style of the div with id="panel" from display:none (hidden) to display:block (visible).</p>
  <p>You will learn more about JavaScript in our JavaScript Tutorial.</p>
</div>

<script>
function myFunction() {
  document.getElementById("panel").style.display = "block";
}
</script>

</body>
</html>

Solution

  • You can make functions "private" by wrapping them in a certain scope.

    In your example that means wrapping it in an immediately invoked function expression:

    (function () {
      function myFunction() {
        document.getElementById("panel").style.display = "block";
      }
    
      // myFunction is only available within the outer function context.
    })();
    

    This also means that the following will no longer work:

    <p class="flip" onclick="myFunction()">Click to show panel</p>
    

    myFunction is no longer publicly available, thus this will now throw an error when clicked. You could however set it through addEventListener when you are still in the same scope as myFunction:

    (function () {
      function myFunction() {
        document.getElementById("panel").style.display = "block";
      }
    
      for(const p of document.querySelectorAll("p.flip")) {
        p.addEventListener("click", myFunction);
      }
    })();