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

    greenkey
    @greenkey
    программист
    Не стоит ругаться и обвинять друг друга в некомпетентности ;-) не знать чего-либо совершенно нормально, даже если ты лет двадцать без устали кодишь. Настоящего профессионала отличает не то, что он знает вообще все, а то, что он прекрасно осознает, что много чего не знает, и его это нисколько не смущает - мы учимся постоянно. Для меня, например, некоторые моменты связанные с closures оказались новыми, и я решил, что надо поглубже погрузиться в данный вопрос.
    А он не так прост, как может показаться на первый взгляд, и содержит в себе целый ряд нюансов, поэтому чрезвычайно важно 1) оперировать одинаково понимаемыми терминами, 2) пойти в документацию, а именно в ecmascript, и, как правильно заметил dollar , проверить, как это было реализовано уже в реальной реализации javascript, в движке, например V8.
    Вопрос, хоть и теоретический, но очень важный, потому что проливает свет на понимание работы современных языков "изнутри", что безусловно важно хорошему программисту.
    Предлагаю всем, кого вопрос также заинтересовал, немного погрузиться в теорию, для начала вот это:
    https://262.ecma-international.org/12.0/#sec-abstr...
    более развернуто в статье, хоть и старой, но принцип closure не поменялся
    dmitrysoshnikov.com/ecmascript/chapter-6-closures
    Оно же на русском:
    dmitrysoshnikov.com/ecmascript/ru-chapter-6-closures
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    snaiper04ek
    @snaiper04ek
    Не стреляйте в эникея, он админит как умеет
    парень. Всё равно ты будешь использовать ту терминологию, которую используют на работе. Если там под замыканием подразумевается замыкание с инкапсуляцией, то после того как тебе сказали что "твой код - говно", было два варианта: 1)поговорить о терминах либо со ссылкой на официальную документацию, либо вместо с собеседником вывести определение исходя из смысла понятия, не прибегая к авторитетам вообще. 2) Сказать о том, что прочитал такое определение у %авторитет%, и сказать, что готов использовать то, которым пользуетесь вы на работе.

    По поводу выведения определения: есть смысл замыкания. Его нужно чётко озвучить согласиться с ним. Например, ты хочешь сказать, что смысл замыкания это ничто иное как "повесить ссылку на переменную с которой окончена работа до объявления функции, для сейва от мусорщика". Спросить - согласен ли с этим собеседник, или есть дополнения/возражения. Если согласен - значит "функция, являющаяся замыканием - любая функция, которая ссылается на переменную вне своего тела, в случае если переменную иначе удалил бы сборщик." Далее нужно договориться, что "иначе удалил бы" можно опускать как лишнюю сущность, которая усложняет определение такой функции, и упростить до - "функция, ссылающаяся на переменную вне своего тела."

    Есть второй вариант: собеседник тебе говорит: "Ахтунг! Замыкание используется не просто для того, чтобы спасти переменную от удаления! Это ещё и способ сокрытия данных: замыканием можно использовать локальную глобальную переменную, вместо того чтобы использовать просто глобальную переменную, или же городить отдельный класс."
    В этом случае всё твое определение идёт в пешее эротическое, и ты соглашаешься, что для этого придётся обернуть функцию в функцию, чтобы у тебя была функция с локальными переменными, которые будут глобальными для этой функции в функции.
    Ответ написан
    13 комментариев