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/18-function-declaration-expression/article.md
+2-39Lines changed: 2 additions & 39 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -136,7 +136,7 @@ var sayHi = function(name) {
136
136
Например, попробуем, в зависимости от условия, объявить функцию `sayHi` по-разному:
137
137
138
138
```js
139
-
//+ run
139
+
//+ run no-strict
140
140
var age =+prompt("Сколько вам лет?", 20);
141
141
142
142
if (age >=18) {
@@ -152,44 +152,7 @@ if (age >= 18) {
152
152
sayHi();
153
153
```
154
154
155
-
При вводе `20` в примере выше в любом браузере, кроме Firefox, мы увидим, что условное объявление не работает. Срабатывает `"До 18 нельзя"`, несмотря на то, что `age = 20`.
156
-
157
-
В чём дело? Чтобы ответить на этот вопрос -- вспомним, как работают функции.
158
-
159
-
<ol>
160
-
<li>Function Declaration обрабатываются перед запуском кода. Интерпретатор сканирует код и создает из таких объявлений функции. При этом второе объявление перезапишет первое.
161
-
</li>
162
-
<li>Дальше, во время выполнения, объявления Function Declaration игнорируются (они уже были обработаны). Это как если бы код был таким:
163
-
164
-
```js
165
-
functionsayHi() {
166
-
alert( 'Прошу вас!' );
167
-
}
168
-
169
-
functionsayHi() {
170
-
alert( 'До 18 нельзя' );
171
-
}
172
-
173
-
var age =20;
174
-
175
-
if (age >=18) {
176
-
/* объявление было обработано ранее */
177
-
} else {
178
-
/* объявление было обработано ранее */
179
-
}
180
-
181
-
*!*
182
-
sayHi(); // "До 18 нельзя", сработает всегда вторая функция
183
-
*/!*
184
-
```
185
-
186
-
...То есть, от `if` здесь уже ничего не зависит. По-разному объявить функцию, в зависимости от условия, не получилось.
187
-
</li>
188
-
</ol>
189
-
190
-
Такое поведение соответствует современному стандарту. На момент написания этого раздела ему следуют все браузеры, кроме, как ни странно, Firefox.
191
-
192
-
**Вывод: для условного объявления функций Function Declaration не годится.**
155
+
Function Declaration при `use strict` видны только внутри блока, в котором объявлены. Так как код в учебнике выполняется в режиме `use strict`, то будет ошибка.
0 commit comments