Javascript从闭包内重新启动计时器

Javascript从闭包内重新启动计时器,javascript,jquery,scope,Javascript,Jquery,Scope,我试图找出如何从setTimeout闭包中重置在立即调用函数中创建的计时器。以下是我的功能: var triggerHeightRecalc = function() { setTimeout(function() { if(imagesLoaded()) { adjustHeight(); } else { triggerHeightRecalc(); } }, 100); }();

我试图找出如何从setTimeout闭包中重置在立即调用函数中创建的计时器。以下是我的功能:

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
}();
如果
imagesLoaded()
返回false,我将在尝试调用
triggerHeightRecalc()
时收到以下错误:

未捕获类型错误:未定义不是函数

所以我不确定问题是函数不在范围内,还是它不能调用自己?我尝试将
triggerHeightRecalc
作为
setTimeout
闭包中的参数传递,但这似乎也不起作用

我在阅读后也尝试过:

我做错了什么,还是有更好的方法?这应该是一个
setInterval()
,而我在加载图像时会清除这个间隔吗


旁注:我正在计算jQuery插件中div的高度,但我需要等待图像加载后才能获得正确的高度(不确定是否相关).

因为您正从声明中调用函数,
triggerHeightRecalc
被设置为该函数调用的返回,这是未定义的,因为您实际上不返回任何内容

你可以做两件事

1。声明然后调用

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
2。将声明包装在
()
中并调用

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

第二个将创建一个全局变量,除非执行
var triggerHeightRecalc在手之前。

因为您正从声明中调用函数,所以将设置为返回该函数调用,这是未定义的,因为您实际上不返回任何内容

你可以做两件事

1。声明然后调用

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
2。将声明包装在
()
中并调用

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

第二个将创建一个全局变量,除非执行
var triggerHeightRecalc在手之前。

因为您正从声明中调用函数,所以将设置为返回该函数调用,这是未定义的,因为您实际上不返回任何内容

你可以做两件事

1。声明然后调用

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
2。将声明包装在
()
中并调用

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

第二个将创建一个全局变量,除非执行
var triggerHeightRecalc在手之前。

因为您正从声明中调用函数,所以将设置为返回该函数调用,这是未定义的,因为您实际上不返回任何内容

你可以做两件事

1。声明然后调用

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
2。将声明包装在
()
中并调用

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

第二个将创建一个全局变量,除非执行
var triggerHeightRecalc在手之前。

已经回答了,但我会把这个放进去

首先,如果您只想等待所有图像加载完毕,可以使用: 然后运行上面的代码

如果这不是您想要的,并且您只想要一个可以运行
setTimeout
的函数,那么您可以删除函数末尾的
()


以下是您当前代码中发生的情况

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
您的函数缺少左括号或类似字符
+(
(功能

此外,您的IIFE没有
return
关键字,并且将
undefined
返回到triggerHeightCalc

如果你真的想要一个iLife,那么你可以拥有一个只能在自己内部调用的私有版本

(function myModule(){
    myModule(); //calls itself
})();
或者一个可以在内部和外部调用的公共版本

var myModule = (function(){
   return function myMod(){
     myMod();
   }
})();

myModule();

已经回答了,但我会把这个放进去

首先,如果您只想等待所有图像加载完毕,可以使用: 然后运行上面的代码

如果这不是您想要的,并且您只想要一个可以运行
setTimeout
的函数,那么您可以删除函数末尾的
()


以下是您当前代码中发生的情况

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
您的函数缺少左括号或类似字符
!+(
(函数

此外,您的IIFE没有
return
关键字,并且将
undefined
返回到triggerHeightCalc

如果你真的想要一个iLife,那么你可以拥有一个只能在自己内部调用的私有版本

(function myModule(){
    myModule(); //calls itself
})();
或者一个可以在内部和外部调用的公共版本

var myModule = (function(){
   return function myMod(){
     myMod();
   }
})();

myModule();

已经回答了,但我会把这个放进去

首先,如果您只想等待所有图像加载完毕,可以使用: 然后运行上面的代码

如果这不是您想要的,并且您只想要一个可以运行
setTimeout
的函数,那么您可以删除函数末尾的
()


以下是您当前代码中发生的情况

var triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
};
triggerHeightRecalc();
var triggerHeightRecalc;
(triggerHeightRecalc = function() {
    setTimeout(function() {
        if(imagesLoaded()) {
            adjustHeight();
        } else {
            triggerHeightRecalc();
        }
    }, 100);
})();
您的函数缺少左括号或类似字符
!+(
(函数

此外,您的IIFE没有
return
关键字,并且将
undefined
返回到triggerHeightCalc

如果你真的想要一个iLife,那么你可以拥有一个只能在自己内部调用的私有版本

(function myModule(){
    myModule(); //calls itself
})();
或者一个可以在内部和外部调用的公共版本

var myModule = (function(){
   return function myMod(){
     myMod();
   }
})();

myModule();

已经回答了,但我会把这个放进去

首先,如果您只想等待所有图像加载完毕,可以使用: 然后运行上面的代码

如果这不是您想要的,并且您只想要一个可以运行
setTimeout
的函数,那么您可以删除函数末尾的
()


这里是wh