Skip to content

Commit d57e781

Browse files
committed
functions.arguments + minor fixes in functions.*
1 parent 99e233e commit d57e781

File tree

4 files changed

+22
-16
lines changed

4 files changed

+22
-16
lines changed

doc/ru/function/arguments.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44

55
> **Замечание:** В случае, если переменная `arguments` уже была объявлена в области видимости функции либо путём присвоения через выражение `var`, либо являясь формальным параметром, объект `arguments` не будет создан.
66
7-
Объект `arguments` **не** является наследником `Array`. Он, конечно же, очень похож на массив, и даже содержит свойство `length` — но он не наследует `Array.prototype`, а представляет собой `Object`.
7+
Объект `arguments` **не** является ни экземпляром, ни наследником `Array`. Он, конечно же, очень похож на массив, и даже содержит свойство `length` — но он не наследует `Array.prototype`, и если внимательно присмотреться, он окажется обычным `Object`.
88

9-
По этой причине, у объекта `arguments` **отсутствуют** стандартные методы массивов, такие как `push`, `pop` или `slice`. Хотя итерация с использованием обычного цикла `for` по агрументам работает вполне корректно, вам придётся конвертировать этот объект в настоящий массив типа `Array`, чтобы применять к нему стандартные методы массивов.
9+
По этой причине, у объекта `arguments` **отсутствуют** стандартные методы массивов, такие как `push`, `pop` или `slice`. Пусть перебор с использованием обычного цикла `for` по аргументам работает вполне корректно, но вам придётся конвертировать этот объект в настоящий массив типа `Array`, чтобы применять к нему стандартные методы массивов.
1010

1111
### Конвертация в массив
1212

13-
Указанный код вернёт новый массив типа `Array`, содержащий все элементы объекта `arguments`.
13+
Этот код вернёт новый массив типа `Array`, содержащий все элементы объекта `arguments`.
1414

1515
Array.prototype.slice.call(arguments);
1616

17-
Эта конвертация занимает **много времени** и использовать её в критических частях кода **не рекомендуется**.
17+
Будьте внимательны — это преобразование занимает **много времени** и использовать его в чувствительных к производительности частях кода **не рекомендуется**.
1818

1919
### Передача аргументов
2020

@@ -27,7 +27,7 @@
2727
// делаем здесь что-нибудь
2828
}
2929

30-
Другой трюк — использовать и `call` и `apply` вместе, чтобы быстро создать несвязанную обёртку:
30+
Другой трюк — использовать и `call` и `apply` вместе, чтобы создать отвязанную от объекта обёртку, выполняющуюся приемлемо быстро:
3131

3232
function Foo() {}
3333

@@ -47,9 +47,9 @@
4747

4848
### Формальные аргументы и индексы аргументов
4949

50-
Объект `arguments` создаёт по *геттеру* и *сеттеру* и для всех своих свойств и для формальных параметров функции.
50+
Объект `arguments` создаёт по одному *геттеру* и по одному *сеттеру* как для всех своих свойств, так и для формальных параметров функции.
5151

52-
В результате, изменение формального параметра также изменит значение соответствующего свойства объекта `arguments` и наоборот.
52+
В результате, изменение формального параметра повлечёт за собой изменение значения соответствующего свойства объекта `arguments` и наоборот.
5353

5454
function foo(a, b, c) {
5555
arguments[0] = 2;
@@ -64,15 +64,15 @@
6464
}
6565
foo(1, 2, 3);
6666

67-
### Мифы и правда о производительности
67+
### Мифы и истина о производительности
6868

69-
Объект `arguments` создаётся во всех случаях, лишь за двумя исключениями — когда он переопределён внутри функции (по имени) или когда одним из её параметров является переменная с таким именем. Неважно, используется при этом сам объект или нет.
69+
Объект `arguments` создаётся во всех случаях, лишь одним исключением — когда он переопределён по имени внутри функции или когда одним из её параметров является переменная с таким именем. Неважно, используется при этом сам объект в коде функции или нет.
7070

71-
*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование практически никак не влияет на производительность.
71+
*Геттеры* и *сеттеры* создаются **всегда**; так что их использование практически никак не влияет на производительность, и тем более никак не влияет на неё в реальном коде, где обычно происходят вещи поважнее обычных прочтений и переопределений свойств объекта `arguments`.
7272

7373
> **ES5 Замечание:** Эти *геттеры* и *сеттеры* не создаются в strict-режиме.
7474
75-
Однако, есть один момент, который может радикально понизить производительность современных движков JavaScript. Этот моментиспользование `arguments.callee`.
75+
Однако, есть одна такая тайна, незнание которой автором кода может радикально понизить его производительность в современных движках JavaScript. Эта тайнаопасность использования `arguments.callee`.
7676

7777
function foo() {
7878
arguments.callee; // сделать что-либо с этим объектом функции
@@ -81,11 +81,11 @@
8181

8282
function bigLoop() {
8383
for(var i = 0; i < 100000; i++) {
84-
foo(); // При обычных условиях должна бы была быть развёрнута...
84+
foo(); // должна была бы «развернуться»
8585
}
8686
}
8787

88-
В коде выше, функция `foo` не может [быть развёрнута][1] (а могла бы), потому что для корректной работы ей необходима ссылка и на себя и на вызвавший её объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
88+
В коде выше, функция `foo` не может [быть «развёрнута»][1] (а могла бы), потому что для корректной работы ей необходима ссылка и на себя и на вызвавший её объект. Такой код не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
8989

9090
**Крайне не рекомендуется** использовать `arguments.callee` или какое-либо из его свойств. **Никогда**.
9191

doc/ru/function/closures.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050

5151
Для получения желаемого результата необходимо создать **копию** переменной `i`.
5252

53-
### Обход проблемы с ссылкой
53+
### Обход проблемы со ссылкой
5454

5555
Для того, чтобы скопировать значение индекса из цикла, лучше всего использовать другую [анонимную функцию](#function.scopes) как обёртку.
5656

doc/ru/function/general.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## Про объявление функций и выражения с ними
1+
## Про объявление функций и о выражениях с ними
22

33
Функции в JavaScript являются объектами. Следовательно, их можно передавать и присваивать точно так же, как и любой другой объект. Популярным сбособом использования этого свойства является передача *анонимной функции* в качестве функции обратного вызова в некую другую функцию — к примеру, при описании асинхронных вызовов.
44

@@ -23,7 +23,7 @@
2323
foo(); // вызовет TypeError
2424
var foo = function() {};
2525

26-
Поскольку выражение с `var` *резервирует* имя переменной `foo` ещё до запуска кода, `foo` уже имеет некое значение во время его исполнения (отсутствует ошибка «`foo` is not defined»).
26+
Поскольку выражение с применением `var` *резервирует* имя переменной `foo` ещё до запуска кода, `foo` уже имеет некое значение во время его исполнения (отсутствует ошибка «`foo` is not defined»).
2727

2828
Но поскольку сами *присвоения* исполняются только непосредственно во время работы кода, `foo` по умолчанию будет иметь лишь значение [`undefined`](#core.undefined) (до обработки строки с определением функции).
2929

doc/ru/function/scopes.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@ JavaScript **высасывает** определения. Это значит,
186186
+function(){}();
187187
(function(){}());
188188

189+
<!--
190+
191+
> **На заметку:** ''прим. перев.'' в JavaScript кроме прочего существует конструкция `new function() {}`, она очень редко используется, но позволяет создать **новый экземпляр** анонимной функции. Например, если вы присваивате нескольким объектам одну и ту же анонимную функцию-конструктор, то `instanceof` перестаёт работать, здесь вам и поможет `new function()`.
192+
193+
-->
194+
189195
### Заключение
190196

191197
Рекомендуется всегда использовать *анонимную обёртку* для заключения кода в его собственное пространство имён. Это не только защищает код от совпадений имён, но и позволяет создавать более модульные программы.

0 commit comments

Comments
 (0)