Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запись внутри console.log() (https://javascript.ru/forum/misc/75653-zapis-vnutri-console-log.html)

AndriiS 26.10.2018 23:38

Запись внутри 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 функцию которая внутри. Она без имени...

Большое спасибо!

Aetae 26.10.2018 23:41

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

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

AndriiS 26.10.2018 23:53

Цитата:

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

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

Я стал похож на Вашу аватарку после прочтения...

Вопрос в том, почему эта загадочная запись console.log(counter()), а именно counter() вызвала внутреннюю функцию?

j0hnik 27.10.2018 00:06

Цитата:

Сообщение от AndriiS
а именно counter() вызвала внутреннюю функцию?

Цитата:

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

в counter результат выполнения makeCounter!
чтобы убедится посмотрите console.log(counter); без скобок ()
и этот результат это функция, а скобки ее запускают

j0hnik 27.10.2018 00:08

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

var counter = (function(){
	var count = 1;
	return ()=>count++;
}());
console.log(counter());

Aetae 27.10.2018 00:13

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 ничем в сути своей не отличается от любого иного объекта. Её можно присвоить, вернуть из другой функции, создать и исполнить на ходу и.т.д. Ей даже можно присвоить собственные методы и свойства.)

MallSerg 27.10.2018 00:30

Загугли функция как объект первого типа. И почитай про назначение и применение такого поведения это довольно мощный иструмент корорый позволяет гибко манипулировать программой ну или скриптом в реальном времени.

j0hnik 27.10.2018 00:34

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


Часовой пояс GMT +3, время: 11:28.