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: 1-js/2-first-steps/15-switch/article.md
+16-16Lines changed: 16 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
Конструкция `switch` заменяет собой сразу несколько `if`.
4
4
5
-
Это -- более наглядный способ сравнить выражение сразу с несколькими вариантами.
5
+
Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами.
6
6
[cut]
7
7
## Синтаксис
8
8
@@ -44,7 +44,7 @@ switch(x) {
44
44
45
45
```js
46
46
//+ run
47
-
var a =2+2;
47
+
var a =2+2;
48
48
49
49
switch (a) {
50
50
case3:
@@ -63,11 +63,13 @@ switch (a) {
63
63
}
64
64
```
65
65
66
-
Будет выведено только одно значение, соответствующее `4`. После чего `break` прервёт выполнение.
66
+
Здесь оператор `switch` последовательно сравнит `a` со всеми вариантами из `case`.
67
67
68
-
**Если его не прервать -- оно пойдёт далее, при этом остальные проверки игнорируются.**
68
+
Сначала `3`, затем -- так как нет совпадения -- `4`. Совпадение найдено, будет выполнен этот вариант, со строки `alert('В точку!')` и далее, до ближайшего `break`, который прервёт выполнение.
69
69
70
-
Например:
70
+
**Если `break` нет, то выполнение пойдёт ниже по следующим `case`, при этом остальные проверки игнорируются.**
71
+
72
+
Пример без `break`:
71
73
72
74
```js
73
75
//+ run
@@ -87,15 +89,15 @@ switch (a) {
87
89
}
88
90
```
89
91
90
-
В примере выше последовательно выполнятся три `alert`.
92
+
В примере выше последовательно выполнятся три `alert`:
91
93
92
94
```js
93
95
alert('В точку!');
94
96
alert('Перебор');
95
97
alert('Я таких значений не знаю');
96
98
```
97
99
98
-
**В `case` могут быть любые выражения**, в том числе включающие в себя переменные и функции.
100
+
В `case` могут быть любые выражения, в том числе включающие в себя переменные и функции.
99
101
100
102
Например:
101
103
@@ -165,21 +167,19 @@ switch(arg) {
165
167
case3:
166
168
alert('Никогда не выполнится');
167
169
168
-
casenull:
169
-
alert('Отмена');
170
-
break;
171
-
172
170
default:
173
171
alert('Неизвестное значение: '+ arg)
174
172
}
175
173
```
176
174
177
-
Что оно выведет при вводе чисел 0, 1, 2, 3? Подумайте и *потом* читайте дальше...
175
+
Что оно выведет при вводе числа 0? Числа 1? 2? 3?
176
+
177
+
Подумайте, выпишите свои ответы, исходя из текущего понимания работы `switch` и *потом* читайте дальше...
178
178
179
179
<ul>
180
-
<li>При вводе `0` или `1` выполнится первый `alert`, далее выполнение продолжится вниз до первого `break` и выведет второй `alert('Два')`.</li>
181
-
<li>При вводе `2`, `switch` перейдет к `case '2'` и выведет `Два`.</li>
182
-
<li>**При вводе `3`, `switch` перейдет на `default`.** Это потому, что `prompt` возвращает строку `'3'`, а не число. Типы разные. `Switch` использует строгое равенство `===`, так что совпадения не будет.</li>
183
-
<li>При отмене сработает `case null`.</li>
180
+
<li>При вводе `0` выполнится первый `alert`, далее выполнение продолжится вниз до первого `break` и выведет второй `alert('Два')`. Итого, два вывода `alert`.</li>
181
+
<li>При вводе `1` произойдёт то же самое.</li>
182
+
<li>При вводе `2`, `switch` перейдет к `case '2'`, и сработает единственный `alert('Два')`.</li>
183
+
<li>**При вводе `3`, `switch` перейдет на `default`.** Это потому, что `prompt` возвращает строку `'3'`, а не число. Типы разные. Оператор `switch` предполагает строгое равенство `===`, так что совпадения не будет.</li>
Copy file name to clipboardExpand all lines: 1-js/2-first-steps/16-function-basics/article.md
+11-36Lines changed: 11 additions & 36 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -65,13 +65,14 @@ alert(message); // <-- будет ошибка, т.к. переменная ви
65
65
66
66
```js
67
67
functioncount() {
68
+
// переменные i,j не будут уничтожены по окончании цикла
68
69
for (*!*var*/!* i=0; i<3; i++) {
69
70
*!*var*/!* j = i *2;
70
71
}
71
72
72
73
*!*
73
-
alert(i); // i=3, на этом значении цикл остановился
74
-
alert(j); // j=4, последнее значение, на котором цикл сработал, было i=2
74
+
alert(i); // i=3, последнее значение i, при нём цикл перестал работать
75
+
alert(j); // j=4, последнее значение j, которое вычислил цикл
75
76
*/!*
76
77
}
77
78
```
@@ -114,13 +115,12 @@ showMessage(); // Привет, я Вася
114
115
115
116
```js
116
117
//+ run
117
-
var*!*userName*/!*='Вася';
118
+
var userName ='Вася';
118
119
119
120
functionshowMessage() {
120
-
*!*
121
121
userName ='Петя'; // (1) присвоение во внешнюю переменную
122
-
*/!*
123
-
var message ='Привет, я '+*!*userName*/!*;
122
+
123
+
var message ='Привет, я '+ userName;
124
124
alert(message);
125
125
}
126
126
@@ -133,13 +133,11 @@ alert(userName); // Петя, значение внешней переменно
133
133
134
134
Конечно, если бы внутри функции, в строке `(1)`, была бы объявлена своя локальная переменная `var userName`, то все обращения использовали бы её, и внешняя переменная осталась бы неизменной.
135
135
136
-
[summary]
137
136
**Переменные, объявленные на уровне всего скрипта, называют *"глобальными переменными"*.**
138
137
139
-
Делайте глобальными только те переменные, которые действительно имеют общее значение для вашего проекта.
138
+
В примере выше переменная `userName` -- глобальная.
140
139
141
-
Пусть каждая функция работает "в своей песочнице".
142
-
[/summary]
140
+
Делайте глобальными только те переменные, которые действительно имеют общее значение для вашего проекта, а нужные для решения конкретной задачи -- пусть будут локальными в соответствующей функции.
Здесь опасность даже не в автоматическом создании переменной, а в том, что глобальные переменные должны использоваться тогда, когда действительно нужны "общескриптовые" параметры.
169
167
170
-
Забыли `var` в одном месте, потом в другом -- в результате одна функция неожиданно поменяла глобальную переменную, которую использует другая. Возможна ошибка и потеря времени на поиск проблемы.
168
+
Забыли `var` в одном месте, потом в другом -- в результате одна функция неожиданно поменяла глобальную переменную, которую использует другая. И поди разберись, кто и когда её поменял, не самая приятная ошибка для отладки.
171
169
[/warn]
172
170
173
171
В будущем, когда мы лучше познакомимся с основами JavaScript, в главе [](/closures), мы более детально рассмотрим внутренние механизмы работы переменных и функций.
from ='**'+ from +'**'; // меняем локальную переменную (1)
202
+
from ='**'+ from +'**'; // меняем локальную переменную from
205
203
*/!*
206
204
alert(from +': '+ text);
207
205
}
@@ -210,32 +208,9 @@ var from = "Маша";
210
208
211
209
showMessage(from, "Привет");
212
210
213
-
alert(from); //"Маша", без изменений, так как в строке (1) была изменена копия значения
211
+
alert(from); //старое значение from без изменений, в функции была изменена копия
214
212
```
215
213
216
-
Здесь есть небольшая тонкость при работе с объектами. Как мы помним, в переменной хранится ссылка на объект. Поэтому функция, получив параметр-объект, работает с самим этим объектом:
217
-
218
-
Например, в коде ниже функция по ссылке меняет содержимое объекта `user`:
219
-
220
-
```js
221
-
//+ run
222
-
functionmakeAdmin(user) {
223
-
user.isAdmin=true;
224
-
}
225
-
226
-
varuser= { name:"Вася" };
227
-
228
-
makeAdmin(user);
229
-
alert(user.isAdmin); // true
230
-
```
231
-
232
-
## Стиль объявления функций
233
-
234
-
В объявлении функции есть правила для расстановки пробелов. Они отмечены стрелочками:
235
-
236
-
<img src="style.png">
237
-
238
-
Конечно, вы можете ставить пробелы и по-другому, но эти правила используются в большинстве JavaScript-фреймворков.
239
214
## Аргументы по умолчанию
240
215
241
216
Функцию можно вызвать с любым количеством аргументов.
0 commit comments