Reading a value from the nearest Provider above, without passing it through every layer.
useContext(SomeContext) reads whatever value the nearest matching Provider ancestor is currently supplying — it resolves to the closest Provider in the tree, not a single global value, which matters when multiple Providers of the same context are nested. It exists to solve prop drilling for values that genuinely need to reach many components at different depths: theme, authenticated user, locale.
The tradeoff that catches people off guard is re-renders: every component consuming a context re-renders whenever the Provider's value changes, regardless of which specific part of that value the component actually uses. Splitting one large context into several smaller, more focused ones — or memoizing the value passed to the Provider — limits how much unrelated re-rendering a single context update causes.
What you'll walk away knowing