Javascript在闭包内重启定时器

Javascript Restart Timer From Within Closure

本文关键字:重启 定时器 闭包 Javascript      更新时间:2023-09-26

我试图弄清楚如何从setTimeout闭包内重置立即调用函数内部创建的计时器。下面是我的函数:

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
}();

如果imagesLoaded()返回false,我在尝试调用triggerHeightRecalc()时收到以下错误:

Uncaught TypeError: undefined is not a function

所以我不确定问题是否在于函数不在范围内,或者它只是不能调用自己?我已经尝试通过triggerHeightRecalc作为setTimeout关闭中的参数,但这似乎也不起作用。

在阅读了这个SO问题后,我也尝试了这个:

var triggerHeightRecalc = function() {
    var that = this;
    var callback = function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            that.triggerHeightRecalc();
        }
     };
     timeDelay = window.setTimeout(callback, 100);
}();

我在这里做错了什么,还是有更好的方法?这应该是一个setInterval(),而不是我清除间隔时,图像加载?

旁注:我正在计算一个jQuery插件内的div的高度,但我需要等到图像加载以获得正确的高度(不确定是否相关)。

由于您正在从声明中调用函数,因此triggerHeightRecalc被设置为该函数调用的返回值,即undefined,因为您实际上不返回任何东西。

你可以做两件事

1。声明然后调用

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();

2。在()中包装声明并调用

var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();

第二个将创建一个全局变量,除非您事先执行var triggerHeightRecalc;

已经回答了,但是我要把这个放进去。

首先,如果你只是想等到所有的图片都加载完毕,你可以使用:https://github.com/desandro/imagesloaded,然后运行上面的代码。

如果这不是你想要的,你只想要一个setTimeout可以运行的函数,那么你可以在函数末尾删除()


这是当前代码中发生的事情

你的函数缺少左括号或类似的字符!+( (function

你的IIFE也没有return关键字,并将返回undefined到triggerHeightCalc。

如果你想要一个IIFE,那么你可以有一个私有版本,它只能在自己内部调用。

(function myModule(){
    myModule(); //calls itself
})();

或可在内部和外部调用的公共版本。

var myModule = (function(){
   return function myMod(){
     myMod();
   }
})();
myModule();

Patrick Evans有正确的理由,但有一个更简洁的方法来解决它:)

(function triggerHeightRecalc() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();

这里你给(仍然)匿名函数一个内部名称。该名称仅在函数本身中可见,在全局作用域中不可见。它被称为命名函数表达式