我试图弄清楚如何从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;
操作。