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