An immediately invoked function expression, as you might have inferred, is a function that is called immediately after it is defined; immediately here means before a semicolon (or implied semicolon) would occur.
IIFEs look like this:
(function() {
// Do something
})();
IIFEs are useful because they enclose the logic inside the function into a new scope (i.e. a closure). This prevents the logic inside the function from polluting the global namespace and allows variable names to be reused. They can also be used to hide other functions and variables, effectively making them private.
You will see module systems like AMD and UMD use IIFEs a lot to isolate modules from the outside. Dependencies that a module imports can be passed into the IIFE as arguments.
I personally will also occasionally use IIFEs in scenarios where I am not otherwise able to declare a block of code as async. Example:
(async function() {
const data = await fetch(url);
})();