You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Это потому, что в соответствии с правилами, которые определяют значение `this`, объектные литералы не влияют на него.
17
+
Это потому, что правила, которые определяют значение `this`, никак не смотрят на объявление объекта. Важен лишь момент вызова метода.
18
18
19
-
Вот здесь значение `this` внутри `makeUser()` является `undefined`, потому что `makeUser()`вызвано как функция, не как метод.
19
+
Здесь значение `this` внутри `makeUser()` является `undefined`, потому что `makeUser()`вызвана как функция, не через "точку" как метод.
20
20
21
-
И литерал объекта сам по себе не влияет на `this`. Значение `this` одно для всей функции, блоков кода, и объектные литералы не воздействуют на него.
21
+
Литерал объекта сам по себе не влияет на `this`. Значение `this` одно для всей функции и блоков кода в ней, литеральные объекты не меняют его.
22
22
23
23
Таким образом, при создании объекта `ref: this` берёт текущее значение `this` функции `makeUser()`.
24
24
25
-
Тут противоположный случай:
25
+
А вот противоположный случай:
26
26
27
27
```js run
28
28
functionmakeUser() {
@@ -41,6 +41,6 @@ let user = makeUser();
41
41
alert( user.ref().name ); // Джон
42
42
```
43
43
44
-
Здесь тоже `makeUser()` вызывается как функция, не как метод. Но теперь это работает, потому что свойство `ref` создаваемого объекта является методом. Это свойство ссылается на код функции, а значит значение `this`на этапе создания объекта не вычисляется - оно будет вычислено только при вызове метода. Когда же происходит вызов метода `user.ref()` - значение `this` внутри метода вычисляется и ссылается на объект, который идёт перед точкой `.`.
44
+
Теперь это работает, поскольку `user.ref()` вызывается как метод. И значением `this`становится объект перед точкой `.`.
0 commit comments