将参数传递给命名函数jshint warning

时间:2016-11-27 07:06:40

标签: javascript jquery jshint

我必须使用外部/命名函数进行悬停,如下所示:

     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隐藏警告?

2 个答案:

答案 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,您可以通过修改onHoverStartonHoverStop进行调用并将其用作关闭每个事件。

// ...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"));
 }

希望有所帮助