Нужно ли использовать iife?
С появлением в ES6 let и const – объявлений с блочной областью видимости – без IIFE можно обходиться там, где их заводили только ради чистоты глобальной о.в.:// раньше
(function(){
  var a = 1;
  var b = 2;
  b *= 2;
  console.log(a + b);
})();
// здесь a и b уже не видны


// теперь можно просто заключить часть кода в "блок"
// и все переменные останутся в Вегасе:
{
  const a = 1;
  let b = 2;
  b *= 2;
  console.log(a + b);
}
сейчас используются замыкания, для тех целей, которым служил iife. 
Вместо iife используют модули, единственный случай, когда вместо iife используют let - асинхронный цикл. Замыкания в JS были всегда, в том числе когда вместо модулей использовали iife
Кстати замыкание это не обязательнофункция обернутая в функцию, любая функция создает замыкание - замыкает в себе от уборщика мусора переменные из внешнего скоупа, которые сама использует.