1

Тема: JS: Как правильно поменять функцию

Здравствуйте!
Подскажите как правильно подставить другую функцию (другой js код) в code

return window._setTimeout(code,delay);

Тут перехват запущенного setTimeout

window._setTimeout=window.setTimeout;
window.setTimeout=function(code,delay){
     return window._setTimeout(code,delay);
};

Спасибо

2

Re: JS: Как правильно поменять функцию

На первый взгляд, путь правильный, хотя ничего нового к setTimeout пока не добавлено (как я понимаю, что-то предлагается добавить перед return), но может быть и нет, т.к. не совсем ясен вопрос.

3 (изменено: Xameleon, 2021-12-29 13:30:03)

Re: JS: Как правильно поменять функцию

pmailer1976, если я верно понял вопрос, то вместо code можно передать анонимную функцию в пределах вызова, а можно ссылкой на уже заранее определённую функцию. Ниже пример. От себя добавил небольшие модификации:
1) Вместо подмены свойства window "спрятал" setTimeout в анонимной функции внутрь переменной, которая недоступна в остальном коде
2) Вызов setTimeout обернул в apply, так как в современных браузерах функция setTimeout имеет более 2-ух параметров:

var timeoutID = window.setTimeout(func, [, delay, param1, param2, ...]);

После указания задержки можно передать параметры, которые должны попасть в функцию вызова.

https://developer.mozilla.org/ru/docs/W … setTimeout


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <script type="text/javascript">
        
        (function(){
            // Hiding setTimeout to fn
            var fn = window.setTimeout
            window.setTimeout = function(){
                return fn.apply(this,arguments)
            }
        })();

        // Anonymous call
        var tid = setTimeout(function(){
            alert('arguments passed to anonymous function: ' + Array.prototype.join.call(arguments, ','));
        },1000,'param1','param2','param3')

        // calling predefined function
        function test(){
            alert('function test called with params: ' + Array.prototype.join.call(arguments, ','));
        }

        var tid = setTimeout(test,1000,'param1','param2','param3')

        </script>
    </head>
</html>

P.S Единственное неудобство - возникает проблема с пробросом контекста this при такой конструкции. В той же статье ниже про это рассказано подробнее.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !