First-class values that carry their own scope, their own this, and sometimes their own surprises.
Functions in JavaScript are first-class values — they can be assigned to variables, passed as arguments, returned from other functions, and stored in data structures, which is what makes patterns like callbacks, higher-order functions, and functional composition possible. But not all functions behave the same way: function declarations are hoisted in full, function expressions are not, and arrow functions differ from both in a way that goes deeper than syntax.
Arrow functions don't have their own this, arguments object, or prototype — they lexically inherit this from wherever they're defined, which makes them predictable inside callbacks but wrong for methods that need their own this. Regular functions, meanwhile, get a fresh this determined by how they're called, not where they're defined, which is the root of most 'why is this undefined' bugs.
What you'll walk away knowing