Functions are JavaScript procedures that perform tasks and can be defined using the function keyword. Functions can have parameters and a body of statements. Functions allow for nested scopes where bindings inside functions are local while bindings outside any function are global. Function values can be passed as arguments, stored in bindings, and used similarly to other values. The call stack stores the context each time a function is called and removes it when the function returns.