¿Cómo se llama inmediatamente a un IIFE para evitar que contamine el alcance global?

En una lección de Udacity sobre expresiones de funciones invocadas inmediatamente (con respecto al fragmento de código proporcionado) dice:

La función que se devuelve se cierra (es decir, captura) la variable hi. ¡Esto permite que myFunction mantenga un estado privado mutable al que no se puede acceder fuera de la función! Además:porque la función expresada se llama de inmediato, el IIFE envuelve bien el código para que no contaminemos el alcance global.

Estoy luchando por comprender qué tiene que ver inmediatamente llamar a la función anónima para evitar que la variablehi de "contaminar el alcance global" y desdehi ya está definido en una función, ¿no está ya en el ámbito local / privado?

const myFunction = (
  function () {
    const hi = 'Hi!';
    return function () {
      console.log(hi);
    }
  }
)();

Respuestas a la pregunta(2)

Su respuesta a la pregunta