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
Глобальный объект предоставляет переменные и функции, доступные в любом месте программы. В основном те, что встроенны в язык или среду исполнения. The global object provides variables and functions that are available anywhere. Mostly, the ones that are built into the language or the host environment.
4
+
Глобальный объект предоставляет переменные и функции, доступные в любом месте программы. В основном те, что встроенны в язык или среду исполнения.
5
5
6
-
В браузере он назыается "window", в Node.js — "global", в другой среде исполнения глобальный объект может называться иначе. In a browser it is named "window", for Node.js it is "global", for other environments it may have another name.
6
+
В браузере он назыается "window", в Node.js — "global", в другой среде исполнения глобальный объект может называться иначе.
7
7
8
-
Например, мы можем вызвать `alert` как метод `window`: For instance, we can call `alert` as a method of `window`:
8
+
Например, мы можем вызвать `alert` как метод `window`:
9
9
10
10
```js run
11
-
alert("Hello");
11
+
alert("Привет");
12
12
13
-
//the same as
14
-
window.alert("Hello");
13
+
//тоже самое что и
14
+
window.alert("Привет");
15
15
```
16
16
17
-
Мы можем ссылаться на другие встроенные функции типа `Array` как `window.Array` или создавать свои собственные свойства глобального объекта. We can reference other built-in functions like `Array` as `window.Array` and create our own properties on it.
17
+
Мы можем ссылаться на другие встроенные функции типа `Array` как `window.Array` или создавать свои собственные свойства глобального объекта.
18
18
19
-
## Браузер: объект "window" Browser: the "window" object
19
+
## Браузер: объект "window"
20
20
21
-
По историческим причинам, браузерный объект `window` выглядит слегка запутанно. For historical reasons, in-browser `window` object is a bit messed up.
21
+
По историческим причинам, браузерный объект `window` выглядит слегка запутанно.
22
22
23
-
1. Он предоставляет инструменты для работы с окном браузера, а также играет роль глобального объекта. It provides the "browser window" functionality, besides playing the role of a global object.
23
+
1. Он предоставляет инструменты для работы с окном браузера, а также играет роль глобального объекта.
24
24
25
-
Мы можем использовать `window` для доступа к свойствам и методам характерным для окна браузера. We can use `window` to access properties and methods, specific to the browser window:
25
+
Мы можем использовать `window` для доступа к свойствам и методам характерным для окна браузера:
26
26
27
27
```js run
28
-
alert(window.innerHeight); // выводит высоту окна браузера shows the browser window height
28
+
alert(window.innerHeight); // выводит высоту окна браузера
29
29
30
-
window.open('http://google.com'); // открывает новое окно браузера opens a new browser window
30
+
window.open('http://google.com'); // открывает новое окно браузера
31
31
```
32
32
33
-
2. Если переменные, объявленные с помощью `var` или декларации функиций находятся на верхнем уровне программы, то они автоматически становятся свойствами `window`.Top-level `var` variables and function declarations automatically become properties of `window`.
33
+
2. Если переменные, объявленные с помощью `var` или декларации функиций находятся на верхнем уровне программы, то они автоматически становятся свойствами `window`.
34
34
35
-
Например For instance:
35
+
Например:
36
36
```js untrusted run no-strict refresh
37
37
var x = 5;
38
38
39
-
alert(window.x); // 5 (var x становиться свойством window) 5 (var x becomes a property of window)
39
+
alert(window.x); // 5 (var x становиться свойством window)
Обратите внимание, что этого не происходит с более современными `let/const` объявлениями. Please note, that doesn't happen with more modern `let/const` declarations:
46
+
Обратите внимание, что этого не происходит с более современными `let/const` объявлениями:
47
47
48
48
```js untrusted run no-strict refresh
49
49
let x = 5;
50
50
51
-
alert(window.x); // undefined ("let" не создаёт свойства window) undefined ("let" doesn't create a window property)
51
+
alert(window.x); // undefined ("let" не создаёт свойства window)
52
52
```
53
53
54
-
3. Кроме того, все скрипты имеют общюю глобальную область видимотси, поэтому переменные, объявленные в одном теге `<script>` становятся видимыми в других. Also, all scripts share the same global scope, so variables declared in one `<script>` become visible in another ones:
54
+
3. Кроме того, все скрипты имеют общюю глобальную область видимотси, поэтому переменные, объявленные в одном теге `<script>` становятся видимыми в других:
55
55
56
56
```html run
57
57
<script>
@@ -65,25 +65,25 @@ window.alert("Hello");
65
65
</script>
66
66
```
67
67
68
-
4. Мелочь, но всё же, значение `this` в глобальной области видимости — `window`. And, a minor thing, but still: the value of `this` in the global scope is `window`.
68
+
4. Мелочь, но всё же, значение `this` в глобальной области видимости — `window`.
69
69
70
70
```js untrusted run no-strict refresh
71
71
alert(this); // window
72
72
```
73
73
74
-
Почему было сделано так? На момент создания языка, объединение нескольких аспектов в одном объекте `window`, должно было "упростить" работу. Но с тех пор многое изменилось. Крошечные скрипты превратились в крупные приложения, требующие правльной архитектуры. Why was it made like this? At the time of the language creation, the idea to merge multiple aspects into a single `window` object was to "make things simple". But since then many things changed. Tiny scripts became big applications that require proper architecture.
74
+
Почему было сделано так? На момент создания языка, объединение нескольких аспектов в одном объекте `window`, должно было "упростить" работу. Но с тех пор многое изменилось. Крошечные скрипты превратились в крупные приложения, требующие правльной архитектуры.
75
75
76
-
Хорошо ли, что разные скрипты (возможно из разных источников) "видят" переменные друг друга? Is it good that different scripts (possibly from different sources) see variables of each other?
76
+
Хорошо ли, что разные скрипты (возможно из разных источников) "видят" переменные друг друга?
77
77
78
-
Нет, потому что это может привести к конфликту имён: одинаковые имена переменных могут использоваться двумя скриптами для различных целей и эти переменные будут конфликтовать между собой. No, it's not, because it may lead to naming conflicts: the same variable name can be used in two scripts for different purposes, so they will conflict with each other.
78
+
Нет, потому что это может привести к конфликту имён: одинаковые имена переменных могут использоваться двумя скриптами для различных целей и эти переменные будут конфликтовать между собой.
79
79
80
-
Сейчас, многоцелевой `window` считается ошибкой проектирования языка. As of now, the multi-purpose `window` is considered a design mistake in the language.
80
+
Сейчас, многоцелевой `window` считается ошибкой проектирования языка.
81
81
82
-
К счастью, есть "дорога из ада" — JavaScript модули. Luckily, there's a "road out of hell", called "JavaScript modules".
82
+
К счастью, есть "дорога из ада" — JavaScript модули.
83
83
84
-
Если мы установим тегу `<script>` атрибут `type="module"`, такой скрипт будет считаться отдельным модулем сосбственной областью видимости верхнего уровня (лексическим окружением) не пересекающейся с `window`. If we set `type="module"` attribute on a `<script>` tag, then such script is considered a separate "module" with its own top-level scope (lexical environment), not interfering with `window`.
84
+
Если мы установим тегу `<script>` атрибут `type="module"`, такой скрипт будет считаться отдельным модулем сосбственной областью видимости верхнего уровня (лексическим окружением) не пересекающейся с `window`.
85
85
86
-
- В модуле `var x` не станет свойством `window`: - In a module, `var x` does not become a property of `window`:
86
+
- В модуле `var x` не станет свойством `window`:
87
87
88
88
```html run
89
89
<script type="module">
@@ -93,7 +93,7 @@ window.alert("Hello");
93
93
</script>
94
94
```
95
95
96
-
- Два модуля, которые не видят переменные друг друга: - Two modules that do not see variables of each other:
96
+
- Два модуля, которые не видят переменные друг друга:
97
97
98
98
```html run
99
99
<script type="module">
@@ -102,40 +102,40 @@ window.alert("Hello");
102
102
103
103
<script type="module">
104
104
alert(window.x); // undefined
105
-
alert(x); // Ошибка: переменная не объявлена Error: undeclared variable
105
+
alert(x); // Ошибка: переменная не объявлена
106
106
</script>
107
107
```
108
108
109
-
- И последнее, в модуле значение `this` на верхнем уровне равно `undefined` (действительно, почему должно быть `window`?): - And, the last minor thing, the top-level value of `this` in a module is `undefined` (why should it be `window` anyway?):
109
+
- И последнее, в модуле значение `this` на верхнем уровне равно `undefined` (действительно, почему должно быть `window`?):
110
110
111
111
```html run
112
112
<script type="module">
113
113
alert(this); // undefined
114
114
</script>
115
115
```
116
116
117
-
**Используйте `<script type="module">`, чтобы исправить недостаток проектирования языка, отделяя область видимости верхнего уровня от `window`. Using `<script type="module">` fixes the design flaw of the language by separating top-level scope from `window`.**
117
+
**Используйте `<script type="module">`, чтобы исправить недостаток проектирования языка, отделяя область видимости верхнего уровня от `window`.**
118
118
119
-
Мы рассмотрим другие свойства модулей позже в главе We'll cover more features of modules later, in the chapter [](info:modules).
119
+
Мы рассмотрим другие свойства модулей позже в главе [](info:modules).
120
120
121
-
## Допустимое (правильное?) использование глобального объекта Valid uses of the global object
121
+
## Допустимое использование глобального объекта
122
122
123
-
1. Обычно не рекомендуется использовать глобальные переменные. Желатьльно, применать как можно мешьше таких переменных. Однако, если нужно поместить что-либо в глобальную область видимости, мы можем захотеть добавить это в `window` (или `global` в Node.js) Using global variables is generally discouraged. There should be as few global variables as possible, but if we need to make something globally visible, we may want to put it into `window` (or `global` in Node.js).
123
+
1. Обычно не рекомендуется использовать глобальные переменные. Желатьльно, применать как можно мешьше таких переменных. Однако, если нужно поместить что-либо в глобальную область видимости, мы можем захотеть добавить это в `window` (или `global` в Node.js).
124
124
125
-
Мы помещаем информацию о текущем пользователе в глобальный объект, чтобы она была доступна другим скриптам. Here we put the information about the current user into a global object, to be accessible from all other scripts:
125
+
Мы помещаем информацию о текущем пользователе в глобальный объект, чтобы она была доступна другим скриптам:
126
126
127
127
```js run
128
-
// явное назначение свойства `window` explicitly assign it to `window`
128
+
// явное назначение свойства `window`
129
129
window.currentUser = {
130
130
name: "John",
131
131
age: 30
132
132
};
133
133
134
-
// далее, где угодно в другом скрипте then, elsewhere, in another script
134
+
// далее, где угодно в другом скрипте
135
135
alert(window.currentUser.name); // John
136
136
```
137
137
138
-
2. Мы можем проверить, поддерживает ли глобальный объект современные возможности языка.We can test the global object for support of modern language features.
138
+
2. Мы можем проверить, поддерживает ли глобальный объект современные возможности языка.
139
139
140
140
Например, проверить наличие встроенного объекта `Promise` (такая поддержка отсутствует в очень старых браузерах). For instance, test if a build-in`Promise` object exists (it doesn't in really old browsers):
141
141
```js run
@@ -144,12 +144,12 @@ window.alert("Hello");
144
144
}
145
145
```
146
146
147
-
3. Мы можем создать полифилл: добавить функции, которые не поддерживаются окружением (скажем, старым браузером), но сущемтвуют в современном стандарте. We can create "polyfills": add functions that are not supported by the environment (say, an old browser), but exist in the modern standard.
147
+
3. Мы можем создать полифилл: добавить функции, которые не поддерживаются окружением (скажем, старым браузером), но сущемтвуют в современном стандарте.
148
148
149
149
```js run
150
150
if (!window.Promise) {
151
-
window.Promise = ... // собственная реализация современной возможности языка custom implementation of the modern language feature
151
+
window.Promise = ... // собственная реализация современной возможности языка
152
152
}
153
153
```
154
154
155
-
...И конечно, если в браузере мы используем `window` для доступа к функциям окна браузера (не как глобального объекта) это вполне нормально. And of course, if we're in a browser, using `window` to access browser windowfeatures (not as a global object) is completely fine.
155
+
...И конечно, если в браузере мы используем `window` для доступа к функциям окна браузера (не как глобального объекта) это вполне нормально.
0 commit comments