AngularJS scopes provide an execution context for expressions and allow for communication between controllers and views. Scopes are arranged hierarchically and mimic the DOM structure, with child scopes prototypically inheriting from parent scopes. Directives like ng-repeat and ng-controller create new child scopes, while others like ng-include use the parent scope. Scopes are created, register watchers, observe mutations during digest cycles, and are destroyed when no longer needed to clean up memory.