• Как использовать регулярные выражения в find?

    DollyPapper
    @DollyPapper
    daxak, posix-extended и есть "обычные". А вот то, что используется в find по умолчанию это emacs регексы. Вероятно да, они работают по другому, не знаю точно, нужно список отличий смотреть.
  • Почему много HTTP запросов - это плохо?

    DollyPapper
    @DollyPapper
    Стоит еще уточнить ко всему прочему, что в http еще дожен быть установлен заголовок Connection: keep-alive, иначе на каждый этот запрос маленьких модулей будет открываться новое tcp соединение, и тогда лучше бандл в 10 метров, чем такое.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    DollyPapper
    @DollyPapper
    Sergio, в си статическая область видимости, так что он не поддерживает замыкания (в явном виде, мб можно как-то эмулировать это, я хз). В жс область видимости динамическая aka Lexical Scoping из за самой его природы, т.е. в один момент скоуп функции может быть в одном месте, в другой момент в другом месте. С этим как раз связана т.н. потеря контекста. Так что замыкания это именно замыкание контекста или Lexical Scoping как правильней это называть.
    это функция, существующая в контексте другой функции

    Это не обязательно условие, просто по другому сложно показывать в примерах существование замыкания, и все примеры как раз основаны на функциях первого класса, из-за этого создается впечатления что это обязательное свойство замыкания. По факту функция автора тоже замыкание, только а) она бесполезна б) не наглядна, и нужно нехило изь*бнутся чтобы увидеть, что она замкнула контекст. Если кто-то тут сможет каким нибудь gdb в рантайме показать структуру данных в памяти и показать, что функция таки замкнула контекст, будет круто. За неимением таких показательных примеров придется верить стандарту на слово.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    DollyPapper
    @DollyPapper
    Матвей Румынин,
    Глобальный объект window существует весь рантайм от запуска программы до ее завершения.
    что не делает это не замыканием.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    DollyPapper
    @DollyPapper
    Василий, теории можно годами строить. Как уже сказано обращение к внешнему окружению это не вещь придуманная специально для замыканий. Она есть почти везде. Но она в то же время является частью замыканий, потому что без этого как мы получим значения из объемлющего блока? Да и Кантор и MDN несут какую-то свою истину. Смысл замыкания, это замкнуть в себе значения стека родительской функции. Вы же в курсе про стек вызовов? Что локальные переменные хранятся в этом самом стеке. Так вот при выходе из тела функции из стека вызовов она удаляется, соотв. мы больше не имеем доступа к ее локальным переменным. При замыкании даже при выходе из функции родителя мы не даем сборщику удалить данные стека родительской функции. А то что тут кучу херни написали, что замыкание это это просто возможность доступа к внешнему лексическому окружению, по этому по умолчанию любая функция - замыкание. Ну нет, это не так. Даже если на 5 секунд вдуматься, а чем этот термин замыкание отличается от изначального термина лексическое окружение? Какую новую функциональность он привносит? Это одно и тоже. Значит замыкание всё же несёт в себе какой-то иной смысл, иначе новый термин бы не появился.
    Собственно в ответах ниже есть хороший пример
    function f() {
        let x = 0, y = 0;
        return () => {
            debugger;
            return x;
        };
    }
    let ff = f();
    ff();

    Если в отладчике хрома посмотреть
    620430f063c42886406890.png
    в скопе появился объект, который так и называется "Closure" aka замыкание.
    Замыкание не создает и не пересоздает окружение, оно использует то, что оно уже замкнуло. В коде выше, мы в объемлющей функции создали локальную по отношению к функции f переменную x. Анонимка внутри в себе эту x замкнула, что мы можем видеть на скриншоте. Хочу еще внести важное замечание. Я не исследовал по факту, действительно ли там используется стек, или какие-то иные структуры (там это в js в браузерах или ноде), по этому достоверно утверждать, что все работает именно со стеком вызова я не могу. Но сути дела это не особо меняет.
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    DollyPapper
    @DollyPapper
    Barrakuda74, и опять же, на MDN написано одно, на википедии например
    Замыкание (англ. closure) в программировании — функция первого класса, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами. Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своей области видимости.

    То есть тут явно говорится
    присутствуют ссылки на переменные, объявленные вне тела этой функции

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

    DollyPapper
    @DollyPapper
    Barrakuda74, вы скоуп путаете с лексическим окружением. На MDN написана не совсем правда
    Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена. Другими словами, замыкание даёт вам доступ к Scope (en-US) внешней функции из внутренней функции.
    . Тут смешано в одно понятие и LE и ES(Execution Scope), хотя это не одно и тоже.
    Вам Alexandroppolus привел пример, что недостаточно. LE дает нам вообще возможность увидеть переменные из родительской области видимости, но не обеспечивает замыкания. Механизм замыкания не дает освободить переменную из родительского ES. Иначе какой вообще смысл вводить понятие замыкания, какая от него польза? Ну можем мы видеть все из родительской области видимости, ну круто, но для этого уже есть понятие - лексическое окружение. Execution Scope это стек вызовов, и на стеке как раз хранятся локальные переменные контекста, лексическое окружение дает нам возможность их видеть, а вот возможность на них сослаться и не отпускать, даже когда родительская функция померла и есть замыкание. Опять же пример Alexandroppolus хорошее тому доказательство. Если у вас есть весомые контраргументы прошу поделитесь, вопрос действительно интересный)
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    DollyPapper
    @DollyPapper
    Нет, не любая функция вкупе с лексическим окружением образует замыкание, а только та функция которая ссылается на переменные глобального (в данном случае) контекста.
    console.log(x); вот тут у ТСа происходит замыкание на глобальный контекст. Без ссылки на x не будет никакого замыкания. А то что функция видит лексическое окружение глобального обьекта это необходимое, но недостаточное условие.
  • Хорошие онлайн-библиотеки, где есть книги по IT?

    DollyPapper
    @DollyPapper
    John Smith, это шутка юмор была если что. Некоторые просто по началу своего пути скитаются по интернету в поисках все более качественной для своего обучения литературы, собирают гору книг которые "нужно" будет прочитать, но после скачивания эти книги скорее всего больше не откроются. С форм фактором это не связано никак, просто онлайн, это значит на компьютере. А на компьютере за книги можно не платить.
  • Хорошие онлайн-библиотеки, где есть книги по IT?

    DollyPapper
    @DollyPapper
    John Smith,
    А в чем преимущество чтения онлайн, интересно?
    можно накачать кучу книг по всем возможным тематикам и никогда их не прочитать
  • Чему учит Марк Лутц?

    DollyPapper
    @DollyPapper
    Roman Kitaev, ок, я тут подумал, не буду так категорично выражаться. Но. В книге Макконела есть одна очень важная вещь - рассказывается про главный технический императив, aka управление сложностью, на котором как раз базируются и остальные идеи в частности Чистая архитектура. Да и любая другая архитектура. Все эти слои, SOLID, это и есть не что иное как управление сложность. У Мартина я явного указания на такую основопологающую важную вещь не помню. А без неё очень сложно понять, нахера вообще вся эта писанина в чистой архитектуре нужна. По этому сначала хорошо бы Совершенный код, после него можно и Мартина.
  • Чему учит Марк Лутц?

    DollyPapper
    @DollyPapper
    Roman Kitaev, и какое откровение не детское вам открыл чистый код?
  • Чему учит Марк Лутц?

    DollyPapper
    @DollyPapper
    Лучше не тратить время на Дядю Боба с его Чистым кодом, а потратить на Макконела с его совершенным.
  • Какая разница между генераторами и массивами?

    DollyPapper
    @DollyPapper
    FanatPHP, мы о каких то тонких материях с размытыми определениями говорим. Экономия кмк все же строится не на самом цикле, а на том факте, что чудес не бывает, и память все же где-то сожрана. В случае с файлом эта память уже сожрана на диске, данные уже там есть и оперативку сама программа у нас не ест. То есть дело то не в цикле, а в том, что данные уже где-то готовые лежат и мы можем лениво их забирать в программу, что и дает экономию памяти. Но опять же только в том случае, когда данные уже где-то есть, в файле, в базе и т.д.
    Вообще мне кажется бессмысленный спор. До меня дошло о чем вы говорите, в целом я с вами согласен.
  • Какая разница между генераторами и массивами?

    DollyPapper
    @DollyPapper
    FanatPHP, я понял о чем вы, но опять же
    $handle = fopen('somefile.txt', 'r');
    
    function gread(){
        global $handle;
        yield fgets($handle);
    }

    Можно читать в ручную, без цикла. То есть генератор от цикла не зависит.
  • Какая разница между генераторами и массивами?

    DollyPapper
    @DollyPapper
    FanatPHP, я кажется понял вашу логику и о чем вы. Ну никто не будет отрицать, что чтобы проитерироваться по массиву, нам нужен этот массив. Если без генератора итерироваться, то нам нужен уже готовый массив. Допустим в этом массиве будет 10к чисел. Для цикла все 10к чисел уже должны в памяти лежать, чтобы можно было по ним пройтись. Итератор в свою очередь не хранит 10к чисел в памяти разом, а выдает одно при каждой итерации. Вот только 10к раз вызвать next current в ручную это безумие, по этому генератор без цикла просто смысла не имеет в плане обработки потока данных. Вы об этом?
  • Какая разница между генераторами и массивами?

    DollyPapper
    @DollyPapper
    FanatPHP, с чего вдруг генератор без цикла работать не будет? Что значит будет работать вообще? Генератор возвращает обьект реализующий интерфейс итератора, который обязывает реализовать методы next и current (там еще некоторые, что не важно в текущем контексте). Можно и в ручную перебирать вызывая эти методы, и никакой цикл не нужен (ну это конечно в порядке бреда, никто так не будет делать).
    Это не учитывая тот момент, что конечно итерируемые обьекты и являются полезной фичей генераторов, но далеко не основной. Не будем забывать, что на основе генераторов можно строить корутины и на их основе асинхронность.
  • Как всё таки работает асинхронность?

    DollyPapper
    @DollyPapper Автор вопроса
    Да, в купе с остальными ответами вы ответили на множество моих вопросов, даже которые еще не возникли. Спасибо!