我必须使用外部/命名函数进行悬停,如下所示:
function onMouseIn(e){
// Do stuff
}
function onMouseOut(e){
// Do stuff
}
for (var btn_index = 0; btn_index < 3; btn_index++) {
btn.hover(onMouseIn,onMouseOut)
}
但是我还需要将参数传递给函数,所以我想出了我对mouseIn和mouseOut事件使用未命名的函数,并使用我想要的参数分别调用我的命名函数onMouseIn和onMouseOut。我还想传递事件和jquery对象。所以我的代码就像这样
function onMouseIn(e,btn){
// Do stuff using arg
}
function onMouseOut(e,btn){
// Do stuff using arg
}
for (var btn_index = 0; btn_index < 3; btn_index++) {
btn.hover(
function(e) {onMouseIn(e,$(this))},
function(e) {onMouseOut(e,$(this))})
}
但是jshint给了我这个警告
不要在循环中创建函数。
那么有没有其他方法将参数传递给命名函数?如果没有那么我如何使jshint隐藏警告?
答案 0 :(得分:1)
如果可能的话,警告建议尝试在循环外部准备函数,这样它们就可以在整个循环中重用:
// ...onMouseIn & onMouseOut...
function onHoverStart() {
onMouseIn("arg");
}
function onHoverStop() {
onMouseOut("arg");
}
for (var btn_index = 0; btn_index < 3; btn_index++) {
btn.hover(onHoverStart, onHoverStop);
}
在循环中使用function
表达式时(至少在不需要闭包的情况下),每次迭代都会创建2个新的Function
个对象,每个对都与第一个对象重复。 JSHint将其标记为可能浪费。
根据您的评论,如果您需要提供的参数之一是迭代器btn_index
,您可以通过修改onHoverStart
和onHoverStop
进行调用并将其用作关闭每个事件。
// ...onMouseIn & onMouseOut...
function onHoverStart(index) { // closure for index
return function (event) { // enclosed event handler
onMouseIn("arg", index, event); // revise the argument order here as needed
};
}
function onHoverStop(index) {
return function (event) {
onMouseOut("arg", index, event);
};
}
for (var btn_index = 0; btn_index < 3; btn_index++) {
btn.hover(onHoverStart(btn_index), onHoverStop(btn_index));
}
(有关闭包的详细信息,请参阅&#34; How do JavaScript closures work?&#34;和&#34; JavaScript closure inside loops – simple practical example&#34;)
答案 1 :(得分:0)
你可以在这里使用bind
将代码更改为以下
function onMouseIn(arg){
// Do stuff using arg
}
function onMouseOut(arg){
// Do stuff using arg
}
for (var btn_index = 0; btn_index < 3; btn_index++) {
btn.hover(onMouseIn.bind(null,"arg"),onMouseOut.bind(null,"arg"));
}
希望有所帮助