Javascript从关闭内重启计时器

时间:2014-07-26 03:46:22

标签: javascript jquery scope

我正在试图弄清楚如何在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的高度,但我需要等到图片加载才能获得正确的高度(不确定是否是有关)。

3 个答案:

答案 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