|
5 | 5 |
|
6 | 6 | В браузере он называется "window", в Node.js — "global", в другой среде исполнения может называться иначе. |
7 | 7 |
|
| 8 | +Недавно, `globalThis` был добавлен в язык как стандартизированное имя для глобального объекта, которое должно поддерживаться в любом окружении. В некоторых браузерах, а именно, в Edge не на Chromium движке `globalThis` ещё не поддерживается, но может быть легко реализован с помощью полифила. Recently, `globalThis` was added to the language, as a standartized name for a global object, that should be supported across all environments. In some browsers, namely non-Chromium Edge, `globalThis` is not yet supported, but can be easily polyfilled. |
| 9 | + |
| 10 | +Все свойства глобального объекта могут быть достигнуты на прямую. All properties of the global object can be accessed directly: |
| 11 | + |
| 12 | +```js run |
| 13 | +alert("Привет"); |
| 14 | + |
| 15 | +// то же самое, что и |
| 16 | +window.alert("Привет"); |
| 17 | +``` |
| 18 | + |
| 19 | +В браузере, глобальные переменные, объявленные, с помощью `var`, становятся свойствами глобального объекта. In a browser, global variables declared with `var` become the property of the global object: |
| 20 | + |
| 21 | +```js run untrusted refresh |
| 22 | +var gVar = 5; |
| 23 | + |
| 24 | +alert(window.gVar); // 5 (становится свойством глобального объекта) 5 (became a property of the global object) |
| 25 | +``` |
| 26 | + |
| 27 | +Пожалуйста, не полагайтесь на это. Такое поведение существует по причинам совместимости. Современные скрипты используют JavaScript-модули, где такого не происходит. Мы разберём их позже в главе [](info:modules). Please don't rely on that! This behavior exists for compatibility reasons. Modern scripts use JavaScript modules where such thing doesn't happen. We'll cover them later in the chapter [](info:modules). |
| 28 | + |
| 29 | +Кроме того, более современные объявления переменных `let` и `const` вообще не проявляют такого поведения. Also, more modern variable declarations `let` and `const` do not exhibit such behavior at all: |
| 30 | + |
| 31 | +```js run untrusted refresh |
| 32 | +let gLet = 5; |
| 33 | + |
| 34 | +alert(window.gLet); // undefined (не становится свойством глобального объекта) undefined (doesn't become a property of the global object) |
| 35 | +``` |
| 36 | + |
| 37 | +Если свойство настольно важное, что вы хотете сделать его доступным глобально, запишите его напрямую, как свойство глобального объекта. If a value is so important that you'd like to make it available globally, write it directly as a property: |
| 38 | + |
| 39 | +```js run |
| 40 | +*!* |
| 41 | +// сделать информацию о текущем пользователе глобальной, для предоставления доступа к ней всем скриптам make current user information global, to let all scripts access it |
| 42 | +window.currentUser = { |
| 43 | + name: "John" |
| 44 | +}; |
| 45 | +*/!* |
| 46 | + |
| 47 | +// где угодно в коде somewhere else in code |
| 48 | +alert(currentUser.name); // John |
| 49 | + |
| 50 | +// или, если у нас есть локальная переменная с именем "value" or, if we have a local variable with the name "value" |
| 51 | +// полумим её из window явно (безопасно!) get it from window explicitly (safe!) |
| 52 | +alert(window.currentUser.name); // John |
| 53 | +``` |
| 54 | + |
| 55 | +Тем не менее, обычно не рекумендуется использование глобальных перемнныех. Следует пременять из как можно реже. Код, где функция на вход получает переменные и выдаёт определённый результат, чище, надёжней и удобней для тестирования. That said, using global variables is generally discouraged. There should be as few global variables as possible. The code design where a function gets "input" variables and produces certain "outcome" is clearer, less prone to errors and easier to test. |
| 56 | + |
| 57 | +## Использование полифилов Using for polyfills |
| 58 | + |
| 59 | +Мы можем проверить, поддерживает ли глобальный объект современные возможности языка. |
| 60 | + |
| 61 | + Например, проверить наличие встроенного объекта `Promise` (такая поддержка отсутствует в очень старых браузерах): |
| 62 | + ```js run |
| 63 | + if (!window.Promise) { |
| 64 | + alert("Ваш браузер очень старый!"); |
| 65 | + } |
| 66 | + ``` |
| 67 | + |
| 68 | +Если нет (скажем, используется старый браузер), мы можем создать полифил: добавить функции, которые не поддерживаются окружением, но существуют в современном стандарте. If there's none (say, we're in an old browser), we can create "polyfills": add functions that are not supported by the environment, but exist in the modern standard. |
| 69 | + |
| 70 | +```js run |
| 71 | +if (!window.Promise) { |
| 72 | + window.Promise = ... // собственная реализация современной возможности языка custom implementation of the modern language feature |
| 73 | +} |
| 74 | +``` |
| 75 | + |
| 76 | +## Итого Summary |
| 77 | + |
| 78 | +- Глобальный объект хранит переменные, которые должны быть доступны в любом месте программы. The global object holds variables that should be available everywhere. |
| 79 | + |
| 80 | + Это включает в себя как встроенные конструкции, например, `Array`, так и характерные для окружения свойства, например, `window.innerHeight` -- высота окна браузера. That includes JavaScript built-ins, such as `Array` and environment-specific values, such as `window.innerHeight` -- the window height in the browser. |
| 81 | +- Глобальный объект имеет универсальное (общее??) имя -- `globalThis`. The global object has a universal name `globalThis`. |
| 82 | + |
| 83 | + ...Но чаще на него ссылаются по-старому, используя имя окружения, такое как `window` (браузер) и `global` (Node.js). Так как `globalThis` появился недавно, он не поддерживается браузерами, созданными не на движке Chromium (можно использовать полифил). But more often is referred by "old-school" environment-specific names, such as `window` (browser) and `global` (Node.js). As `globalThis` is a recent proposal, it's not supported in non-Chromium Edge (but can be polyfilled). |
| 84 | +- Следует хранить значения в глобальном объекте, только если они действительно глобальны для нашего проекта. И стараться свести их количество к минимуму. We should store values in the global object only if they're truly global for our project. And keep their number at minimum. |
| 85 | +- В браузерах, если только мы не используем [modules](info:modules), глобальные переменные, объявленные с помощью `var`, становятся свойствами глобального объекта. In-browser, unless we're using [modules](info:modules), a global variable declared with `var` becomes a property of the global object. |
| 86 | + |
| 87 | + Для того, чтобы код был проще и его легче было поддерживать в будущем, следует обращаться к свойствам глобального объекта напрямую: `window.x = ...` вместо `var x = ...`. To make the code easier to understand and more future-proof, we should operate directly on the properties of the global object: `window.x = ...` instead of `var x = ...`. |
| 88 | + |
| 89 | +--- |
| 90 | + |
| 91 | +# Глобальный объект |
| 92 | + |
| 93 | +Глобальный объект предоставляет переменные и функции, доступные в любом месте программы. В основном те, что встроены в язык или среду исполнения. |
| 94 | + |
| 95 | +В браузере он называется "window", в Node.js — "global", в другой среде исполнения может называться иначе. |
| 96 | + |
8 | 97 | Например, вызовем `alert` как метод `window`: |
9 | 98 |
|
10 | 99 | ```js run |
|
0 commit comments