Vanilla JavaScript Dynamically Calling a Function

Chris Bongers - Jul 18 '20 - - Dev Community

Have you ever had the scenario where you needed to call a function, but based on a variable?

In my most recent use case, I have an area of dynamic modules and loop over them; then, if I find one of these, I want to call the function dynamically.

So how do we go about this?

Defining our Functions

First, let's start by making our functions.

function customClick(button) {
  button.addEventListener('click', function(event) {
    alert('custom click');
  });
}

function customUppercase(input) {
  input.addEventListener('keyup', function() {
    input.value = input.value.toUpperCase();
  });
}
Enter fullscreen mode Exit fullscreen mode

Not very exciting functions but good enough to test with.

For this we are going to use the following HTML

<input type="text" data-module="customUppercase" /> <br /><br />
<button type="submit" data-module="customClick">Done</button>
Enter fullscreen mode Exit fullscreen mode

JavaScript Dynamically Calling a Function

Ok, let's start by defining our array of custom objects.

var options = ['Click', 'Uppercase'];
Enter fullscreen mode Exit fullscreen mode

We will now loop over these:

for (var i = 0; i < options.length; i++) {
  console.log(options[i]);
}
Enter fullscreen mode Exit fullscreen mode

Within the modules we need to get all the types that have the data-module we are passing:

for (var i = 0; i < options.length; i++) {
  var items = document.querySelectorAll('[data-module="custom' + options[i] + '"]');
  for (var j = 0; j < items.length; j++) {
    // Call function
  }
}
Enter fullscreen mode Exit fullscreen mode

Now, we need to call the function dynamically!

for (var i = 0; i < options.length; i++) {
  var items = document.querySelectorAll('[data-module="custom' + options[i] + '"]');
  for (var j = 0; j < items.length; j++) {
    this['custom' + options[i]](items[j]);
  }
}
Enter fullscreen mode Exit fullscreen mode

That's it! Have a shot at this Codepen.

See the Pen Vanilla JavaScript Dynamically Calling a Function by Chris Bongers (@rebelchris) on CodePen.

Alt Text

Thank you for reading, and let's connect!

Thank you for reading my blog. Feel free to subscribe to my email newsletter and connect on Facebook or Twitter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player