Hoisting is an advanced and difficult to understand concept of Javascript. It becomes more challenging to follow when you deal with multiple scopes and declarations.
IIFE is an advanced design pattern used in Javascript. Because of the quirky syntax and how functions work in javascript, its a little difficult to understand concept.