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
Copy file name to clipboardExpand all lines: doc/ru/function/arguments.md
+8-11Lines changed: 8 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,6 @@
1
1
## Объект `arguments`
2
2
3
-
В области видимости любой функции в JavaScript есть доступ к специальной переменной `arguments`. Эта переменная содержит в себе список всех аргументов? переданных данной функции ghb dspjdt.
4
-
5
-
Every function scope in JavaScript can access the special variable `arguments`.
6
-
This variable holds a list of all the arguments that were passed to the function.
3
+
В области видимости любой функции в JavaScript есть доступ к специальной переменной `arguments`. Эта переменная содержит в себе список всех аргументов, переданных данной функции.
7
4
8
5
> **Замечание:** В случае, если переменная `arguments` уже была объявлена в области видимости функции либо путём присвоения через выражение `var`, либо являясь формальным параметром, объект `arguments` не будет создан.
9
6
@@ -17,7 +14,7 @@ This variable holds a list of all the arguments that were passed to the function
17
14
18
15
Array.prototype.slice.call(arguments);
19
16
20
-
Эта конвертация занимает **много времени** и **не рекомендуется**использовать её в критических частях кода.
17
+
Эта конвертация занимает **много времени** и использовать её в критических частях кода**не рекомендуется**.
21
18
22
19
### Передача аргументов
23
20
@@ -27,7 +24,7 @@ This variable holds a list of all the arguments that were passed to the function
27
24
bar.apply(null, arguments);
28
25
}
29
26
function bar(a, b, c) {
30
-
// делаем здесь что-либо
27
+
// делаем здесь что-нибудь
31
28
}
32
29
33
30
Другой трюк — использовать и `call` и `apply` вместе, чтобы быстро создать несвязанную обёртку:
@@ -69,9 +66,9 @@ This variable holds a list of all the arguments that were passed to the function
69
66
70
67
### Мифы и правда о производительности
71
68
72
-
Объект `arguments` создаётся во всех случаях, лишь за двумя исключениямии — когда он переопределён по имени внутри функции или когда одним из её параметров является переменная с таким именем. Не важно, используется он при этом или нет.
69
+
Объект `arguments` создаётся во всех случаях, лишь за двумя исключениями — когда он переопределён внутри функции (по имени) или когда одним из её параметров является переменная с таким именем. Не важно, используется при этом сам объект или нет.
73
70
74
-
*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование почти никак не влияет на производительность.
71
+
*Геттеры* и *сеттеры* создаются **всегда**; так что, их использование практически никак не влияет на производительность.
75
72
76
73
> **ES5 Замечание:** Эти *геттеры* и *сеттеры* не создаются в strict-режиме.
77
74
@@ -88,11 +85,11 @@ This variable holds a list of all the arguments that were passed to the function
88
85
}
89
86
}
90
87
91
-
В коде выше, `foo` больше не может [быть развёрнута][1], потому что ей необходима ссылка и на себя, и на вызвавший объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
88
+
В коде выше, `foo` больше не может [быть развёрнута][1], потому что для работы ей необходима ссылка и на себя и на вызвавший её объект. Это не только кладёт на лопатки механизм развёртывания, но и нарушает принцип инкапсуляции, поскольку функция становится зависима от конкретного контекста вызова.
92
89
93
-
**Крайне рекомендуется****никогда** не использовать `arguments.callee` или его свойства.
90
+
**Крайне не рекомендуется** использовать `arguments.callee` или какое-либо из его свойств. **Никогда**.
94
91
95
-
> **ES5 Замечание:** В strict-режиме `arguments.callee`выбросит`TypeError`, поскольку его использование принято устаревшим.
92
+
> **ES5 Замечание:** В strict-режиме использование `arguments.callee`породит`TypeError`, поскольку его использование принято устаревшим.
Constructors in JavaScript are yet again different from many other languages. Any
4
-
function call that is preceded by the `new` keyword acts as a constructor.
3
+
Создание конструкторов в JavaScript также отличается от большинства других языков. Любая функция вызванная с использованием ключевого слова `new` будет конструктором.
5
4
6
-
Inside the constructor - the called function - the value of `this` refers to a
7
-
newly created `Object`. The [`prototype`](#object.prototype) of this **new**
8
-
object is set to the `prototype` of the function object that was invoked as the
9
-
constructor.
5
+
Внутри конструктора (вызываемой функции) `this` будет указывать на новосозданный `Object`. [Прототипом](#object.prototype) этого **нового** объекта будет `prototype` функции, которая была вызвана в качестве коструктора.
10
6
11
-
If the function that was called has no explicit `return` statement, then it
12
-
implicitly returns the value of `this` - the new object.
7
+
Если вызываемая функция не имеет явного возврата посредством `return`, то вернётся `this` — этот новый объект.
13
8
14
9
function Foo() {
15
10
this.bla = 1;
@@ -21,16 +16,14 @@ implicitly returns the value of `this` - the new object.
21
16
22
17
var test = new Foo();
23
18
24
-
The above calls `Foo` as constructor and sets the `prototype` of the newly
25
-
created object to `Foo.prototype`.
19
+
В этом примере `Foo` вызывается как конструктор и прототип созданного объекта будет привязан к `Foo.prototype`.
26
20
27
-
In case of an explicit `return` statement the function returns the value
28
-
specified that statement, **but only** if the return value is an `Object`.
21
+
В случае, когда функция в явном виде возвращает некое значение используя `return`, то мы получим именно его, **но только** если возвращаемое значение представляет собой `Object`.
29
22
30
23
function Bar() {
31
24
return 2;
32
25
}
33
-
new Bar(); // a new object
26
+
new Bar(); // новый объект
34
27
35
28
function Test() {
36
29
this.value = 2;
@@ -39,23 +32,20 @@ specified that statement, **but only** if the return value is an `Object`.
39
32
foo: 1
40
33
};
41
34
}
42
-
new Test(); // the returned object
35
+
new Test(); // возвращённый объект
43
36
44
-
When the `new` keyword is omitted, the function will **not**return a new object.
37
+
Если же опустить ключевое слово `new`, то функция **не**будет возвращать каких-либо объектов.
While the above example might still appear to work in some cases, due to the
52
-
workings of [`this`](#function.this) in JavaScript, it will use the
53
-
*global object* as the value of `this`.
44
+
Приведенный пример в некоторых случаях может всё-таки сработать, это связано с поведением [`this`](#function.this) в JavaScript — он будет восприниматься парсером как *глобальный объект*.
54
45
55
-
### Factories
46
+
### Фабрики
56
47
57
-
In order to be able to omit the `new` keyword, the constructor function has to
58
-
explicitly return a value.
48
+
Если хотите избавится от `new`, напишите конструктор, возвращающий значение используя `return`.
59
49
60
50
function Bar() {
61
51
var value = 1;
@@ -72,25 +62,17 @@ explicitly return a value.
72
62
new Bar();
73
63
Bar();
74
64
75
-
Both calls to `Bar` return the exact same thing, a newly create object which
76
-
has a property called `method` on it, that is a
77
-
[Closure](#function.closures).
65
+
В обоих случаях при вызове `Bar` мы получим один и тот же результат — новый объект со свойством `method` (спасибо [замыканию](#function.closures) за это).
78
66
79
-
It is also to note that the call `new Bar()` does **not** affect the prototype
80
-
of the returned object. While the prototype will be set on the newly created
81
-
object, `Bar` never returns that new object.
67
+
Так же следует заметить, что вызов `new Bar()` никак **не** связан с прототипом возвращаемого объекта. Хоть прототип и назначается всем новосозданным объектам, но `Bar` никогда не возвращает этот новый объект.
82
68
83
-
In the above example, there is no functional difference between using and
84
-
not using the `new` keyword.
69
+
В предыдущем примере нет функциональных отличий между вызовом конструктора с или без `new`.
85
70
71
+
### Создание объектов используя фабрики
86
72
87
-
### Creating new objects via factories
73
+
Часто рекомендуется **не** использовать `new`, поскольку если вы его забудете, это может привести к багам.
88
74
89
-
An often made recommendation is to **not** use `new` since forgetting its use
90
-
may lead to bugs.
91
-
92
-
In order to create new object, one should rather use a factory and construct a
93
-
new object inside of that factory.
75
+
Чтобы создать новый объект, лучше использовать фабрику и создать новый объект *внутри* этой фабрики.
94
76
95
77
function Foo() {
96
78
var obj = {};
@@ -107,22 +89,13 @@ new object inside of that factory.
107
89
return obj;
108
90
}
109
91
110
-
While the above is robust against a missing `new` keyword and certainly makes
111
-
the use of [private variables](#function.closures) easier, it comes with some
112
-
downsides.
92
+
Хотя данный пример и сработает, если вы забыли ключевое слово `new` и благодаря ему легче работать с [приватными переменными](#function.closures), у него есть несколько недостатков
113
93
114
-
1. It uses more memory since the created objects do **not** share the methods
115
-
on a prototype.
116
-
2. In order to inherit the factory needs to copy all the methods from another
117
-
object or put that object on the prototype of the new object.
118
-
3. Dropping the prototype chain just because of a left out `new` keyword
119
-
somehow goes against the spirit of the language.
94
+
1. Он использует больше памяти, поскольку созданные объекты **не** хранят методы в прототипе и соответственно для каждого нового объекта создаётся копия каждого метода.
95
+
2. Чтобы эмулировать наследование, фабрике нужно скопировать все методы из другого объекта или установить прототипом нового объекта старый.
96
+
3. Разрыв цепи прототипов просто по причине забытого ключевого слова `new` идёт в разрез с духом языка.
120
97
121
-
### In conclusion
98
+
### Заключение
122
99
123
-
While omitting the `new` keyword might lead to bugs, it is certainly **not** a
124
-
reason to drop the use of prototypes altogether. In the end it comes down to
125
-
which solution is better suited for the needs of the application, it is
126
-
especially important to choose a specific style of object creation **and stick**
127
-
with it.
100
+
Хотя забытое ключевое слово `new` и может привести к багам, это точно **не** причина отказываться от использования прототипов. В конце концов, полезнее решить какой из способов лучше совпадает с требованиями приложения, очень важно выбрать один из стилей создания объектов и **не изменять** ему.
0 commit comments