我正在试图弄清楚如何在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的高度,但我需要等到图片加载才能获得正确的高度(不确定是否是有关)。
答案 0 :(得分:2)
由于您正在从声明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;
。
答案 1 :(得分:1)
已经回答,但我会把它放进去。
首先,如果您只想等到所有图片都已加载,您可以使用: 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();
答案 2 :(得分:0)
帕特里克·埃文斯有正确的理由,但有一种更简洁的方法来解决它:)
(function triggerHeightRecalc() {
setTimeout(function() {
if(imagesLoaded()) {
adjustHeight();
} else {
triggerHeightRecalc();
}
}, 100);
})();
这里给出(仍然)匿名函数的内部名称。该名称仅在函数本身内可见,在全局范围内不可见。它叫做Named function expression。