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

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


如果imagesLoaded()返回false,则尝试调用triggerHeightRecalc()会收到以下错误消息:


  未捕获的TypeError:undefined不是函数


因此,我不确定问题是否在于功能不在范围内,还是它本身无法调用?我尝试过在triggerHeightRecalc闭包中将setTimeout作为参数传递,但这似乎也不起作用。

在阅读this SO question后,我也尝试过此操作:

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;操作。

09-17 06:10