Page 91 - 6108
P. 91

властивості  функції,  яке  називається  [[Scope]].  Це  властивість  закрите  від
               прямого доступу, але знання про нього дуже  важливо для розуміння  того, як
               працює JavaScript.

                     При  створенні  функція  отримує  приховане  властивість  [[Scope]],  яке
               посилається на лексичне оточення, в якому вона була створена.
                     В  наведеному  вище  прикладі  таким  оточенням  є  window,  так  що
               створюється властивість:

                     sayHi. [[Scope]] = window

                     Це  властивість  ніколи  не  змінюється.  Воно  всюди  слідує  за  функцією,
               прив'язуючи її, таким чином, до місця свого народження.
                     При  запуску  функції  її  об'єкт  змінних  LexicalEnvironment  отримує
               посилання на «зовнішнє лексичне оточення» зі значенням з [[Scope]].
                     Якщо змінна не знайдена в функції – вона буде шукатися зовні.
                     Саме завдяки цій механіці в прикладі  вище  alert(userName)  виводить
               зовнішню  змінну.  На  рівні  коду  це  виглядає  як  пошук  у  зовнішній  області
               видимості, поза функцією.
                     Якщо узагальнити:
                     Кожна функція при створенні отримує посилання [[Scope]] на об'єкт зі
               змінними, в контексті якого була створена.
                     При     запуску      функції      створюється       новий      об'єкт     зі   змінними
               LexicalEnvironment. Він отримує посилання на зовнішній об'єкт змінних з
               [[Scope]].
                     При  пошуку  змінних  він  здійснюється  спочатку  в  поточному  об'єкті
               змінних, а потім – за цим посиланням.
                     Значення  змінної  з  зовнішньої  області  береться  завжди  поточне.  Воно
               може бути вже не те, що було на момент створення функції.
                     Усередині функції можна оголошувати не тільки локальні змінні, а й інші
               функції. Вкладені функції отримують [[Scope]] так само, як і глобальні.

                     var x = 10;
                     function foo() {
                       var y = 20; // вільна змінна
                       function bar() {
                         var z = 15; // вільна змінна
                         return x + y + z;
                       }
                       return bar;
                     }

                     Як можете бачити, bar вкладений в foo (рис.3.1).
   86   87   88   89   90   91   92   93   94   95   96