Задать вопрос
  • Как сделать на CSS Grid (или на чем то другом) поворачивающую область?

    Seasle
    @Seasle Куратор тега CSS

    Пока так, может придумаю лучше или кто-нибудь еще предложит что.
    Ответ написан
    2 комментария
  • Запутался в замыкании + обертка, разбермся?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Тут все просто:
    ...
    
    function delay(func, timeOut) {
        // при вызове delay(func, timeOut) мы создаем анонимную функцию и возвращаем ее
        // но при этом внутри нее мы обращаемся к переданному параметру func 
        // создавая тем самым замыкание на него
        return function() {
            // внутри возвращаемой анонимной функции мы запускаем таймер
            // которому передаем параметр func являющейся функцией, определенной 
            // где то вовне этот таймер выполнит func но при этом внутри самой func 
            // уже будет не видны параметры переданные для анонимной функции. 
            // Внутри анонимной функции эти параметры можно получить через arguments.
            // Тля того, чтобы func могла получить к ним доступ, мы используем apply, 
            // привязывая к func контент вызова анонимной функции и ее arguments
            // тем самым создавая замыкания к this и arguments анонимной функции
            setTimeout(func.apply(this, arguments), timeOut);
            // как правильно подсказал @bingo347, эту строчку надо немного переписать
            setTimeout(func.bind(this, ...arguments), timeOut);
        }
    }
    
    // примерно того же эффекта можно было добиться следующим кодом
    function delay(func, timeOut) {
        return function(text) {
            setTimeout(()=>func(text), timeOut);
        }
    }
    
    // можно даже добиться не примерно такого, а точно такого же эффекта
    // (за исключением привязки контекста анонимной функции через this
    // который влияет лишь на возможность обратится непосредственно
    // к методам и свойствам самой анонимной функции, которых в вашем
    // примере не объявлено ))) 
    function delay(func, timeOut) {
        return function(...args) {
            setTimeout(()=>func(...args), timeOut);
        }
    }
    ...


    по теме:
    arguments
    apply

    PS: но ваш способ с учетом поправок от Дмитрий Беляев (как и мой второй способ) правильнее, потому что позволяет не переписывая функцию delay делать так:
    function f(argument1, argument2) {
        alert(argument1 + " " + argument2);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222"); // показывает "1111 2222" после 1000 мс


    и так:
    function f(argument1, argument2, argument3) {
        alert(argument1 + " " + argument2 + " " + argument3);
    }
    let f1000 = delay(f, 1000);
    f1000("1111", "2222", "3333"); // показывает "1111 2222 3333" после 1000 мс


    и так далее ))))
    Ответ написан
    1 комментарий