Задать вопрос
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @lazarevBoris
    dollar, Нет, не нужно переопределять, урезая возможности. Ваше желание подогнать определение под ваши задачи вполне объяснимо, т.к. ваша теория будет ложиться в канву именно ваших практических реализаций, но так не работает. Я уже объяснял почему - это частный случай.

    для понятия важно, чтобы все его понимали одинаково

    Для понятия важно, чтобы его в принципе понимали. Если его нужно понимать так, как понимает какой-то конкретный тимлид, следует давать конкретную задачу с применением замыкания, после чего пускай проверяет, решена ли вообще задача или нет, и есть ли в нём замыкание.

    всеобъемлющие определения предлагаю оставить теоретикам, а пользоваться теми, которые реально помогают отделить мух от котлет

    Ваше определение (про захват переменных внешней функцией) рано или поздно даст сбой, оно не отделяет мух от котлет.
    Между собой - да, пожалуйста, когда джуну нужно по-быстрому объяснить, чтобы понимал пока именно так, т.к. по-другому в вашей компании всё равно не используется.
    Но если надёжно - то лучше спросить у теоретиков, чтобы потом не споткнуться на нестандартной ситуации.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @lazarevBoris
    dollar,
    а что можно считать официальным источником определения? Википедию? А если я напишу книгу и дам там своё определение?)

    Вообще так по мне - определение лучше не то, что даётся "наиболее авторитетным/официальным" источником, а то, что наиболее точно отражает понятие в данном контексте на сегодняшний день. Для меня и MDN вполне весомый источник в сфере веб-разработки, но обратите внимание, что даже там, с появлением es6, до сих пор "Замыкание это комбинация функции и..." А ведь мы знаем, что теперь это лишь частный случай.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @lazarevBoris
    dollar,
    Про то, что все функции - замыкания (в Scheme), сказал не я, а автор ответа (и он в свою очередь не сам придумал, а процитировал)

    Вы ведь понимаете, что говоря "все функции - замыкания" никто не собирается отождествлять эти два понятия, просто уж так получилось в некоторых языках, что любая функция тащит за собой лексическое окружение. И именно это имеется в виду, когда так говорят.

    Суть моего комментария в том..., а не в том, что якобы все функции - замыкания.

    Да, вот я как раз об этом говорил. Тогда и сами должны понимать, что ваши два "если" и бритва Оккама здесь не к месту.

    Суть моего комментария в том, что вводимое понятие должно иметь практический смысл

    Так ведь имеет. Функция + лексическое окружение = замыкание. Всё, на этом вся теория.
    А уж как вы будете это применять на практике - это лично ваше дело. Это не противоречит и вставке функции в функцию, где первая потащит за собой окружение последней и те, что выше (до глобального в своём модуле). И никто не мешает вам тащить в этом окружении массу переменных, а можете и ничего не тащить. Это также не противоречит и тому, что внешнее лексическое окружение будет не от функции, а от чего-нибудь ещё, как в примере с фреймом, да и с примером, который был приведён на собеседовании. В общем, определение - это одно, а уж как вы там будете юзать на практике эти замыкания, дело только ваше. Но вы не можете лишь исходя из своей практики (или просто исходя из того, как вам проще понимать) переопределять исходное определение.

    все понимали под этим термином одно и то же (а именно захват переменных внешней функции)

    Нет, не все. Это просто наиболее частый случай из практики. Если некоторым так проще было понимать замыкания - не вижу в этом ничего предосудительного. Но в таком случае программист должен осознавать, что однажды он для себя упростил определение замыкания, а значит если когда-либо вдруг будет собеседовать кого-либо на эту тему, то спрашивать нужно не само определение, которое у него в голове, а пример реализации чего-то конкретного через замыкания.

    Но мы почему-то не уходим в своей практике так далеко от того, что удобно и имеет смысл при решении проблем.

    Никуда не уходим. Определения нужны для того, чтобы определять. Ваше определение "Замыкание - захват переменных внешней функции" не в полном объёме определяет то, что является замыканием. Это лишь частный случай замыкания.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    @lazarevBoris
    dollar,
    все функции - замыкания

    1. Вроде не функция - замыкание, а функция + окружение = образование замыкания.
    2. Функции и замыкания не тождественные понятия и имеют совершенно разные определения.
    3. То, что именно всякая функция несет с собой своё окружение - это лишь особенности javascript.
    dollar,
    замыканием не может быть ничто, кроме функции

    4. Циклы, да и вообще любой блок кода в js с появлением let.
    ... можно долго продолжать.

    Не натягивайте сову на глобус. Бритвой Оккама здесь и не пахнет, более того, бритва Оккама - это далеко не универсальное средство принятия решений, во многих случаях этот принцип просто неприменим (особенно там, где точность важнее простоты - а мы разговариваем о программировании, на секундочку). Вы точно знаете о чём он, когда это произносите? Потому что складывается ощущение, что просто вставляете рандомно для красивого словца.
  • Как работает генератор сложных паролей?

    @lazarevBoris
    Дружище не обращай внимание на токсиков, тут полно идиотов, Ivan Yakushenko норм ответил.
  • Как работает генератор сложных паролей?

    @lazarevBoris
    лучший ответ.
    у остальных не ответы, а какие-то токсичные отрыжки, фу.