Javascript在闭包内重启定时器
Javascript Restart Timer From Within Closure
我试图弄清楚如何从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);
})();
这里你给(仍然)匿名函数一个内部名称。该名称仅在函数本身中可见,在全局作用域中不可见。它被称为命名函数表达式
- 如果弹出窗口关闭,Javascript停止/重置计时器
- 如何在php/javascript中制作定时器和警报
- 双倒计时定时器
- 如何在Javascript中定义一个简单的自动重启倒计时
- 一个定时器事件会在多大程度上减慢我在JavaScript中的代码
- MDN文档中关于弄清楚XUL元素的段落是什么意思:“如何将覆盖扩展转换为无重启”
- 在两次java定时器循环后重定向访问者
- jquery倒计时定时器-按键重置
- 重定向到上一页的定时器脚本
- Javascript在闭包内重启定时器
- 我的分钟定时器没有重置为零
- 如何重置setInterval定时器?
- 刷新时不重启的Jquery/Javascript计时器
- 重置jQuery定时器
- jQuery倒计时-重置定时器
- 如何重置和设置定时器功能
- 使用javascript的倒计时计时器不应该在重新加载时重启
- JQuery插件-重定向定时器调试
- 如何制作 4 小时自动重启计时器
- AS3 -使用外部接口.调用重置JS定时器