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/06-advanced-functions/07-new-function/article.md
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -29,9 +29,9 @@ let sayHi = new Function('alert("Hello")');
29
29
sayHi(); // Hello
30
30
```
31
31
32
-
Главное отличие от других способов объявления функции, которые были рассмотрены ранее, заключается в том, что функция создаётся полностью «на лету» из строки.
32
+
Главное отличие от других способов объявления функции, которые были рассмотрены ранее, заключается в том, что функция создаётся полностью "на лету" из строки.
33
33
34
-
Всё предыдущие объявления требовали от нас, программистов, писать объявление функции в скрипте.
34
+
Все предыдущие объявления требовали от нас, программистов, писать объявление функции в скрипте.
35
35
36
36
Но `new Function` позволяет превратить любую строку в функцию. Например, можно получить новую функцию с сервера и затем выполнить ее:
37
37
@@ -62,7 +62,7 @@ function getFunc() {
62
62
return func;
63
63
}
64
64
65
-
getFunc()(); // ошибка: значение не определено
65
+
getFunc()(); // ошибка: value не определено
66
66
```
67
67
68
68
Сравним это с обычным объявлением:
@@ -83,19 +83,19 @@ getFunc()(); // *!*"test"*/!*, из лексического окружения
83
83
84
84
Эта особенность `new Function` выглядит странно, но оказывается очень полезной на практике.
85
85
86
-
Представьте, что нужно создать функцию из строки. Код этой функции неизвестен во время написания скрипта (вот поэтому не используем обычные функции), а будет определен только в процессе выполнения. Мы можем получить код с сервера или другого ресурса.
86
+
Представьте, что нужно создать функцию из строки. Код этой функции неизвестен во время написания скрипта (вот поэтому не используем обычные функции), а будет определён только в процессе выполнения. Мы можем получить код с сервера или другого ресурса.
87
87
88
88
Наша новая функция должна взаимодействовать с основным скриптом.
89
89
90
90
А что, если мы хотим, чтобы она имела доступ к внешним локальным переменным родителя?
91
91
92
-
Проблема в том, что до отправки JavaScript-кода на продакшен, код сжимается с помощью *минификатора (minifier)* - специальная программа, которая уменьшает размер кода, удаляя комментарии, лишние пробелы, и, что самое главное, переименовывает локальные переменные в более короткие.
92
+
Проблема в том, что перед отправкой JavaScript-кода на реальные работающие проекты код сжимается с помощью *минификатора* - специальной программы, которая уменьшает размер кода, удаляя комментарии, лишние пробелы, и, что самое главное, локальным переменным даются укороченные имена.
93
93
94
94
Например, если в функции объявляется переменная `let userName`, то минификатор изменяет её на `let a` (или другую букву, если она не занята), и изменяет её везде. Обычно так делать безопасно, потому что переменная является локальной и никто снаружи не имеет к ней достп. И внутри функции минификатор заменяет каждое её упоминание. Минификаторы достаточно умные. Они не просто "тупой" поиск-замена, они анализируют структуру кода, и поэтому ничего не ломают.
95
95
96
-
Но если `new Function`может получить доступ к внешним локальным переменным родителя, то она не сможет найти `userName`, так как она выполняется *после* минификации кода.
96
+
Но если `new Function`могла бы получить доступ к внешним локальным переменным родителя, то она не смогла бы найти `userName`, так как она выполняется *после* минификации кода.
97
97
98
-
**Даже если бы мы могли получить доступ к внешнему лексическому окружению `new Function`, у нас были бы проблемы с миниификаторами.**
98
+
**Даже если бы мы могли получить доступ к внешнему лексическому окружению `new Function`, у нас были бы проблемы с минификаторами.**
99
99
100
100
"Особое свойство" `new Function` бережёт нас от ошибок.
0 commit comments