【问题标题】:Any way to avoid using anonymous functions in jQuery?有什么方法可以避免在 jQuery 中使用匿名函数?
【发布时间】:2009-11-03 22:27:28
【问题描述】:

如果我有一大段这样的代码:

.hover(
        function () {
            hoverState($("#navbar a").index(this),1);
        },
        function () {
            hoverState($("#navbar a").index(this),-1);
});

有什么办法可以去掉匿名函数,直接说:

.hover(
    hoverState($("#navbar a").index(this),1),
    hoverState($("#navbar a").index(this),-1);
);

【问题讨论】:

  • 当您尝试发布的第二个 sn-p 时效果如何?
  • @Andy - 不会很顺利...

标签: javascript jquery anonymous-function


【解决方案1】:

不,否则你的电话:

hoverState($("#navbar a").index(this),1)

将与对悬停函数本身的调用同时进行评估。由于 Javascript 支持闭包和一等函数,您可以创建一个包装函数:

function wrapper(position){
    function _f(){
        hoverState($("#navbar a").index(this), position);
    }
    return _f;
}

然后使用:

.hover(
    wrapper(1),
    wrapper(-1),
)

但这种方法的收益值得怀疑。

【讨论】:

  • 这是一个很好的解释。我不仅知道该怎么做,而且我现在意识到这绝对不是我想做的。谢谢!
【解决方案2】:

匿名函数的原因是将对 hoverState 的调用推迟到悬停事件发生。如果没有一些函数引用,您最终会调用 hoverState 并且函数调用的结果将成为悬停方法的参数,这肯定不是您想要的。另一种方法是使用命名函数,但这并没有更好,而且在某些方面实际上更糟。

【讨论】:

    【解决方案3】:

    有一种方法可以做这样的事情,the jLambda plugin

    // Without plugin:
    $('.foo').click(
                function() {
                    $(this).hide();
                    $('p').show();
                    $('a').width(20);
                });
    
    // With plugin:
    $('.foo').click($l.hide().$('p').show().$('a').width(20));
    

    【讨论】:

      【解决方案4】:

      我的回答可能看起来很愚蠢,但在这里......你可以使用简单的函数:}

      function hoverStateProxy1() {
              hoverState($("#navbar a").index(this),1);
      }
      
      
      function hoverStateProxy2() {
              hoverState($("#navbar a").index(this),-1);
      }
      
      .hover(hoverStateProxy1, hoverStateProxy2);
      

      只要你传递对函数的引用就可以了。可以匿名也可以不匿名。

      【讨论】:

      • 我认为这种方法行不通,因为您没有将“this”值传递给函数。
      • 我实际上想过做这样的事情,但就像 fudgey 说的那样,由于“this”值,它不会起作用。此外,您似乎已经定义了一个函数,重新定义了它,并调用了它两次;)
      • 它可以正常工作,这将是鼠标悬停/关闭的元素
      • 我有点懒得检查这个,但我认为这会按预期工作
      【解决方案5】:

      您可以使用JavaScript's "Apply" Function。这是一个取自 Prototype.js 框架的示例(绑定实现,但如果不在框架内使用它可能应该重命名)。

      编辑:已更正,请参阅This Post

      if (!Object.bind) {
          Function.prototype.bind= function(owner) {
              var that= this;
              var args= Array.prototype.slice.call(arguments, 1);
              return function() {
                  return that.apply(owner,
                      args.length===0? arguments : arguments.length===0? args :
                      args.concat(Array.prototype.slice.call(arguments, 0))
                  );
              };
          };
      }
      

      用法:

      .hover(
          hoverState.bind(this,$("#navbar a").index(this),1),
          hoverState.bind(this,$("#navbar a").index(this),-1)
      );
      

      【讨论】:

      • function.bind 将成为 ECMAScript 5 的标准部分,所以我推荐它。但是上面的实现是不完整的;另一个独立的实现见stackoverflow.com/questions/748941/… 的结尾。 (此外,该示例中似乎有几个虚假的左括号。)
      • 啊,我发那个帖子的时候好像有点仓促。已更新。
      猜你喜欢
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多