Страницы

Поиск по вопросам

четверг, 4 октября 2018 г.

Синтаксис замыканий в JS

Первый раз столкнувшись с замыканиями и не зная, что это такое, пробовал синтаксически понять, что происходит в коде вида: (function(){})(). Известно, что конструкция "()" - это вызов функции. Возникал вопрос по поводу первых круглых скобок
Позже, проникнувшись темой, вопрос первых круглых скобок меня волновать не перестал. Зачем они нужны, если без них всё работает?
При этом ни одного примера в статьях про замыкания без применения первых круглых скобок я не видел.
Классический пример замыкания в JavaScript:
buttons[i].onclick = (function(a){ return function(){ console.log(a);} })(i)
без первых скобок:
buttons[i].onclick = function(a){ return function(){ console.log(a);} }(i)
Зачем во всех примерах эти, получается лишние, синтаксические элементы?


Ответ

Ключевое слово function в js может употребляться в двух контекстах - это контекст объявления функции и контекст выражения, где это слово создает анонимную функцию.
Если строка начинается со слова function - то это объявление функции. С такой функцией нельзя ничего сразу же сделать (например, вызвать), кроме того, у нее должно быть имя.
function (a) { console.log(a) } (5) // Ошибка
Поэтому такую функцию во что-нибудь оборачивают:
+function (a) { console.log(a) } (5) // 5 !function (a) { console.log(a) } (5) // 5 ~function (a) { console.log(a) } (5) // 5 (function (a) { console.log(a) }) (5) // 5 (function (a) { console.log(a) } (5)) // 5
Если же слово function стоит не в начале строки - то ничего делать и не надо, все будет прекрасно работать:
var a = function (a) { return 5 } (5)

Комментариев нет:

Отправить комментарий