Рекомендую ознайомитись з офіційною поглибленою документацією про сфери застосування. Почніть із розділу "Ієрархії сфери застосування":
https://docs.angularjs.org/guide/scope
По суті, $ rootScope і $ scope ідентифікують конкретні частини DOM, в яких
- Проводяться кутові операції
- доступні змінні, оголошені як частина $ rootScope або $ scope
Все, що належить до $ rootScope, доступне у всьому світі у вашому додатку Angular, тоді як все, що належить до $-області, доступне в тій частині DOM, до якої ця сфера застосовується.
$ RootScope застосовується до елемента DOM, який є кореневим елементом програми Angular (звідси і назва $ rootScope). Коли ви додаєте директиву ng-app до елемента DOM, це стає кореневим елементом DOM, у якому доступний $ rootScope. Іншими словами, властивості і т.д. $ rootScope будуть доступні у всьому вашому додатку Angular.
Область $ Angular (і всі її змінні та операції) доступна для певної підмножини DOM у вашому додатку. Зокрема, область $ для будь-якого конкретного контролера доступна для тієї частини DOM, до якої застосовано цей конкретний контролер (з використанням директиви ng-controller). Зверніть увагу, що певні директиви, наприклад, ng-repeat, при застосуванні в тій частині DOM, де застосовано контролер, можуть створювати дочірні сфери основного обсягу - всередині того самого контролера - контролер не обов'язково містить лише один обсяг.
Якщо ви подивитесь на згенерований HTML під час запуску програми Angular, ви зможете легко побачити, які елементи DOM "містять" область дії, оскільки Angular додає клас ng-scope до будь-якого елемента, до якого застосовано область (включаючи кореневий елемент) програми, яка має $ rootScope).
До речі, знак '$' на початку $ scope і $ rootScope - це просто ідентифікатор у Angular для речей, які зарезервовані Angular.
Зауважте, що використання $ rootScope для обміну змінними тощо між модулями та контролерами, як правило, не вважається найкращою практикою. Розробники JavaScript говорять про те, щоб уникнути "забруднення" глобальної області дії, обмінюючись там змінними, оскільки пізніше можуть бути зіткнення, якщо змінна з такою ж назвою використовується десь ще, без того, щоб розробник зрозумів, що вона вже оголошена в $ rootScope. Важливість цього зростає із збільшенням розміру програми та команди, яка її розробляє. В ідеалі $ rootScope міститиме лише константи або статичні змінні, які призначені постійно узгоджуватися в додатку. Кращим способом обміну матеріалами між модулями може бути використання сервісів та фабрик, що є іншою темою!