- local (blocks) - only active, accessible to the local function or block - inner blocks can see outer blocks, not vice versa - not preserved between function calls - global - declared outside function or class - accessible throughout the program - okay to use constants - be careful with variables - `static` - initialized once on first function call - retains value between function calls - behaves as a global variable for its function