|
4 | 4 |
|
5 | 5 | > **Замечание:** В случае, если переменная `arguments` уже была объявлена в области видимости функции либо путём присвоения через выражение `var`, либо являясь формальным параметром, объект `arguments` не будет создан.
|
6 | 6 |
|
7 |
| -Объект `arguments` **не** является наследником `Array`. Он, конечно же, очень похож на массив, и даже содержит свойство `length` — но он не наследует `Array.prototype`, а представляет собой `Object`. |
| 7 | +Объект `arguments` **не** является ни экземпляром, ни наследником `Array`. Он, конечно же, очень похож на массив, и даже содержит свойство `length` — но он не наследует `Array.prototype`, и если внимательно присмотреться, он окажется обычным `Object`. |
8 | 8 |
|
9 |
| -По этой причине, у объекта `arguments` **отсутствуют** стандартные методы массивов, такие как `push`, `pop` или `slice`. Хотя итерация с использованием обычного цикла `for` по агрументам работает вполне корректно, вам придётся конвертировать этот объект в настоящий массив типа `Array`, чтобы применять к нему стандартные методы массивов. |
| 9 | +По этой причине, у объекта `arguments` **отсутствуют** стандартные методы массивов, такие как `push`, `pop` или `slice`. Пусть перебор с использованием обычного цикла `for` по аргументам работает вполне корректно, но вам придётся конвертировать этот объект в настоящий массив типа `Array`, чтобы применять к нему стандартные методы массивов. |
10 | 10 |
|
11 | 11 | ### Конвертация в массив
|
12 | 12 |
|
13 |
| -Указанный код вернёт новый массив типа `Array`, содержащий все элементы объекта `arguments`. |
| 13 | +Этот код вернёт новый массив типа `Array`, содержащий все элементы объекта `arguments`. |
14 | 14 |
|
15 | 15 | Array.prototype.slice.call(arguments);
|
16 | 16 |
|
17 |
| -Эта конвертация занимает **много времени** и использовать её в критических частях кода **не рекомендуется**. |
| 17 | +Будьте внимательны — это преобразование занимает **много времени** и использовать его в чувствительных к производительности частях кода **не рекомендуется**. |
18 | 18 |
|
19 | 19 | ### Передача аргументов
|
20 | 20 |
|
|
27 | 27 | // делаем здесь что-нибудь
|
28 | 28 | }
|
29 | 29 |
|
30 |
| -Другой трюк — использовать и `call` и `apply` вместе, чтобы быстро создать несвязанную обёртку: |
| 30 | +Другой трюк — использовать и `call` и `apply` вместе, чтобы создать отвязанную от объекта обёртку, выполняющуюся приемлемо быстро: |
31 | 31 |
|
32 | 32 | function Foo() {}
|
33 | 33 |
|
|
47 | 47 |
|
48 | 48 | ### Формальные аргументы и индексы аргументов
|
49 | 49 |
|
50 |
| -Объект `arguments` создаёт по *геттеру* и *сеттеру* и для всех своих свойств и для формальных параметров функции. |
| 50 | +Объект `arguments` создаёт по одному *геттеру* и по одному *сеттеру* как для всех своих свойств, так и для формальных параметров функции. |
51 | 51 |
|
52 |
| -В результате, изменение формального параметра также изменит значение соответствующего свойства объекта `arguments` и наоборот. |
| 52 | +В результате, изменение формального параметра повлечёт за собой изменение значения соответствующего свойства объекта `arguments` и наоборот. |
53 | 53 |
|
54 | 54 | function foo(a, b, c) {
|
55 | 55 | arguments[0] = 2;
|
|
64 | 64 | }
|
65 | 65 | foo(1, 2, 3);
|
66 | 66 |
|
67 |
| -### Мифы и правда о производительности |
| 67 | +### Мифы и истина о производительности |
68 | 68 |
|
69 |
| -Объект `arguments` создаётся во всех случаях, лишь за двумя исключениями — когда он переопределён внутри функции (по имени) или когда одним из её параметров является переменная с таким именем. Неважно, используется при этом сам объект или нет. |
| 69 | +Объект `arguments` создаётся во всех случаях, лишь одним исключением — когда он переопределён по имени внутри функции или когда одним из её параметров является переменная с таким именем. Неважно, используется при этом сам объект в коде функции или нет. |
70 | 70 |
|
71 |
| -*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование практически никак не влияет на производительность. |
| 71 | +*Геттеры* и *сеттеры* создаются **всегда**; так что их использование практически никак не влияет на производительность, и тем более никак не влияет на неё в реальном коде, где обычно происходят вещи поважнее обычных прочтений и переопределений свойств объекта `arguments`. |
72 | 72 |
|
73 | 73 | > **ES5 Замечание:** Эти *геттеры* и *сеттеры* не создаются в strict-режиме.
|
74 | 74 |
|
75 |
| -Однако, есть один момент, который может радикально понизить производительность современных движков JavaScript. Этот момент — использование `arguments.callee`. |
| 75 | +Однако, есть одна такая тайна, незнание которой автором кода может радикально понизить его производительность в современных движках JavaScript. Эта тайна — опасность использования `arguments.callee`. |
76 | 76 |
|
77 | 77 | function foo() {
|
78 | 78 | arguments.callee; // сделать что-либо с этим объектом функции
|
|
81 | 81 |
|
82 | 82 | function bigLoop() {
|
83 | 83 | for(var i = 0; i < 100000; i++) {
|
84 |
| - foo(); // При обычных условиях должна бы была быть развёрнута... |
| 84 | + foo(); // должна была бы «развернуться» |
85 | 85 | }
|
86 | 86 | }
|
87 | 87 |
|
88 |
| -В коде выше, функция `foo` не может [быть развёрнута][1] (а могла бы), потому что для корректной работы ей необходима ссылка и на себя и на вызвавший её объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова. |
| 88 | +В коде выше, функция `foo` не может [быть «развёрнута»][1] (а могла бы), потому что для корректной работы ей необходима ссылка и на себя и на вызвавший её объект. Такой код не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова. |
89 | 89 |
|
90 | 90 | **Крайне не рекомендуется** использовать `arguments.callee` или какое-либо из его свойств. **Никогда**.
|
91 | 91 |
|
|
0 commit comments