Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.10.2018, 23:38
Интересующийся
Отправить личное сообщение для AndriiS Посмотреть профиль Найти все сообщения от AndriiS
 
Регистрация: 05.09.2018
Сообщений: 28

Запись внутри console.log()
Добрый день!

Помогите пожалуйста разобраться. Есть вот такой код по теме "замыкания".

"use strict"

function makeCounter() {
let currentCount = 1;
return function () {
return currentCount++;
};
}

let counter = makeCounter();

console.log(counter());

В последней строке в console.log() записана counter() - имя переменной со скобками!!! Функции counter() в коде нет. Counter - это имя объявленной переменной. Почему к ней приписали скобки? Что это за форма записи и где это описано? И это работает. Я подозреваю, что вызвали call-back функцию которая внутри. Она без имени...

Большое спасибо!
Ответить с цитированием
  #2 (permalink)  
Старый 26.10.2018, 23:41
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

В js в переменную можно засунуть что угодно, в том числе и функцию. Что и происходит.

Говоря шире, в js есть на самом деле только одна сущность - объект, всё остальное производные, подведение которых может быть дополнено, но это не делает их отдельными сущностями.
__________________
29375, 35

Последний раз редактировалось Aetae, 26.10.2018 в 23:47.
Ответить с цитированием
  #3 (permalink)  
Старый 26.10.2018, 23:53
Интересующийся
Отправить личное сообщение для AndriiS Посмотреть профиль Найти все сообщения от AndriiS
 
Регистрация: 05.09.2018
Сообщений: 28

Сообщение от Aetae Посмотреть сообщение
В js в переменную можно засунуть что угодно, в том числе и функцию. Что и происходит.

Говоря шире, в js есть на самом деле только одна сущность - объект, всё остальное производные, подведение которых может быть дополнено, но это не делает их отдельными сущностями.
Я стал похож на Вашу аватарку после прочтения...

Вопрос в том, почему эта загадочная запись console.log(counter()), а именно counter() вызвала внутреннюю функцию?
Ответить с цитированием
  #4 (permalink)  
Старый 27.10.2018, 00:06
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от AndriiS
а именно counter() вызвала внутреннюю функцию?
Сообщение от Aetae
В js в переменную можно засунуть что угодно, в том числе и функцию. Что и происходит.
в counter результат выполнения makeCounter!
чтобы убедится посмотрите console.log(counter); без скобок ()
и этот результат это функция, а скобки ее запускают
Ответить с цитированием
  #5 (permalink)  
Старый 27.10.2018, 00:08
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

может так вам проще понять будет.

var counter = (function(){
	var count = 1;
	return ()=>count++;
}());
console.log(counter());
Ответить с цитированием
  #6 (permalink)  
Старый 27.10.2018, 00:13
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,495

function makeCounter() {
  let currentCount = 1;
  return function () {
    return currentCount++;
  };
}
тоже самое что
function makeCounter() {
  let currentCount = 1;
  function новаяФункцияСозданаяПриВызове_makeCounter() {
    return currentCount++;
  };
  return новаяФункцияСозданаяПриВызове_makeCounter
}
просто без лишних телодвижений.

Всё просто же:
function makeCounter() {
  let currentCount = 1;
  function новаяФункцияСозданаяПриВызове_makeCounter() {
    return currentCount++;
  };
  return новаяФункцияСозданаяПриВызове_makeCounter
}
let counter = makeCounter(); // counter = новаяФункцияСозданаяПриВызове_makeCounter
console.log(counter()); // console.log(новаяФункцияСозданаяПриВызове_makeCounter())

Функция, как и говорилось выше, в js ничем в сути своей не отличается от любого иного объекта. Её можно присвоить, вернуть из другой функции, создать и исполнить на ходу и.т.д. Ей даже можно присвоить собственные методы и свойства.)
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 27.10.2018, 00:30
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Загугли функция как объект первого типа. И почитай про назначение и применение такого поведения это довольно мощный иструмент корорый позволяет гибко манипулировать программой ну или скриптом в реальном времени.
Ответить с цитированием
  #8 (permalink)  
Старый 27.10.2018, 00:34
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

лучше "функция объект первого класса"
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переопределение метода внутри iframe Илья Колдунов Events/DOM/Window 0 21.04.2017 21:50
Внутри разворачивающегося по клику DIVа не работают ссылки JavaScriptNoob Элементы интерфейса 2 17.11.2015 00:01
getUserMedia() как отследить последующие изменения разрешений на запись? Amateur Элементы интерфейса 0 20.10.2015 22:30
ng-repeat внутри ng-repeat cartrege Angular.js 1 24.10.2013 14:25
Обертка на console.log German Malinovskiy Общие вопросы Javascript 8 14.08.2012 17:58