Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2021, 00:00
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Замыкания в Javascript
Очень много инфо о замыканих, но немного размыта информация самого смысла его использования.
Главный смысл замыканий сохранить локальную переменную после завершения функции и использовать при запуске 2-ого, 3-его, n-ого раза запуском главной функции в котором встроена внутренняя?

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
var fn = (function() {
   var numberOfCalls = 0;
   return function() {
      return ++ numberOfCalls;
   }
})();
    </script>
</body>
</html>


Интересует, обычно функцию объявляют вначале круглые скобки, а затем фигурные и там список команд в фигурных, а здесь получается круглые и снова круглые? Разве так еще можно объявлять функцию?
Речь про концовку
Цитата:
})();
Переменной fn присвоилась функция, а затем какие-то скобки еще круглые пошли в самом конце функции, для чего?

Вот показал на скрине, функцию объявляют сразу с двумя подряд круглыми скобками что ли или это одновременно и объявление и вызов этой же функции? Разве так можно?
Изображения:
Тип файла: jpg Снимок.JPG (27.5 Кб, 3 просмотров)

Последний раз редактировалось denis_alekss, 29.01.2021 в 00:09.
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2021, 00:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от denis_alekss
это одновременно и объявление и вызов этой же функции?
да
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2021, 14:39
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от denis_alekss
Разве так еще можно объявлять функцию?
Это называется IIFE (Immediately Invoked Function Expression) и не имеет отношения к замыканиям.

Сообщение от denis_alekss
и использовать при запуске 2-ого, 3-его, n-ого раза запуском главной функции в котором встроена внутренняя?
Сначала один раз вызывают главную (внешнюю) функцию. Результатом выполнения этой функции должна быть ссылка на внутреннюю функцию, которую уже и вызывают много раз (через полученную ссылку на неё).
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2021, 21:30
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Сообщение от Белый шум Посмотреть сообщение
Это называется IIFE (Immediately Invoked Function Expression) и не имеет отношения к замыканиям. х
А описанная внутренняя анонимная функция в функции fn разве не замыкание?

Когда я присваиваю переменной fn функцию, а в ней еще внутренняя анонимная функция, переменная fn содержит ссылку на функцию в функции, то есть 2 функции или ссылку только на анонимную внутреннюю одну?

Последний раз редактировалось denis_alekss, 29.01.2021 в 21:33.
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2021, 21:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от denis_alekss
только на анонимную внутреннюю одну?
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2021, 21:41
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Это все потому что стоит return function(),
А если бы return не стоял для вызова анонимной функции тогда все равно fn содержал бы ссылку на анонимную функцию или он содержит ссылку только на то что возвращает return главной функции fn?
Ответить с цитированием
  #7 (permalink)  
Старый 29.01.2021, 21:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

denis_alekss,
console.log(fn)
Ответить с цитированием
  #8 (permalink)  
Старый 29.01.2021, 21:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

denis_alekss,
если интересно уберите строку var numberOfCalls = 0; но сохраните прежний функционал и даже сделайте его более универсальным.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
var fn = (function() {
   var numberOfCalls = 0;
   return function() {
      return ++ numberOfCalls;
   }
})();

console.log(fn());//1
console.log(fn());//2
console.log(fn());//3

var foo = (function() {
   /*var numberOfCalls = 0;*/
   return function() {
      return ++ numberOfCalls;
   }
})();

console.log(foo());//1
console.log(foo());//2
console.log(foo());//3

    </script>
</body>
</html>

Последний раз редактировалось рони, 29.01.2021 в 21:55.
Ответить с цитированием
  #9 (permalink)  
Старый 29.01.2021, 22:00
Аспирант
Отправить личное сообщение для denis_alekss Посмотреть профиль Найти все сообщения от denis_alekss
 
Регистрация: 01.12.2020
Сообщений: 55

Если запустить ваш вариант, вначале выдаст
1 2 3

А затем ошибку:

Цитата:
Uncaught ReferenceError: numberOfCalls is not defined
foo http://test.ru/:23

Если так:

var foo = (function() {
   /*var numberOfCalls = 0;*/
   return function() {
	   numberOfCalls = 0;
      return ++ numberOfCalls;
   }
})();


Выведет 3 раза подряд цифру 1 вместо 1 2 3
Ответить с цитированием
  #10 (permalink)  
Старый 29.01.2021, 22:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

denis_alekss,
обе функции должны выдавать одно и тоже, плюс foo будет более универсальной.
это не меняйте
return function() {
      return ++ numberOfCalls;
   }

с остальным делайте, что хотите , var numberOfCalls = 0; не использовать
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замыкания в javascript Smike Общие вопросы Javascript 11 01.10.2014 00:15
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Интерпретатор Java на JS kobezzza Оффтопик 24 11.10.2012 18:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34