代码之家  ›  专栏  ›  技术社区  ›  Rich Bradshaw

到处绑定匿名函数

  •  1
  • Rich Bradshaw  · 技术社区  · 14 年前

    我通常编写类似这样的代码(但使用了更多的处理程序)。

    $(document).ready(function() {
    
        $("#next").click(function() {
            doStuff();
        });
    
        $("#prev").click(function() {
            doSomeOtherStuff();
        });
    
        $("#link").hover(function() {
            doSomeTotallyOtherStuff();
        });
    });
    

    这是最好的方法吗?我应该换一种方式吗? Paul Irish's presentation 暗示这是个坏主意。是真的吗?

    3 回复  |  直到 11 年前
        1
  •  3
  •   BenMorel Manish Pradhan    11 年前

    我们喜欢使用对象文本模式和命名函数。我会这样改写你的例子:

    $(function() {
      Example.somegrouping.init();
    });
    
    var Example.somegrouping = {
      init: function() {
        // set up listeners
        $("#next").click(this.onNextClick);
        $("#prev").click(this.onPrevClick);
        $("#link").hover(this.onLinkHover);
      },
      onNextClick: function() {
        // do some stuff
      },
      onPrevClick: function() {
        // do some stuff
      },
      onLinkHover: function() {
        // do some stuff
      }    
    };
    

    为什么?好吧,它使得在其他地方重用事件处理程序更容易,而不需要使用触发器。函数的命名可以帮助自己记录代码。测试/调试更容易。对象文本只向全局命名空间添加一个条目,因此与页面可能使用的其他脚本冲突的可能性很小。

        2
  •  0
  •   Pointy    14 年前

    用老的无聊方法定义函数很有用的一个原因是,您可以在堆栈跟踪中查看名称。

    $(function() {
      function nextClickHandler() { ... };
    
      $('#next-button').click(nextClickHandler);
    });
    

    在函数中使用函数名是不安全的 表达 :

      $('#next-button').click(function nextClickHandler() { // DO NOT DO THIS
      });
    

    这有点不幸,但你去了。

        3
  •  0
  •   cthom06    14 年前

    只要不在一个循环或运行多次的其他代码(即循环函数调用)中执行,这就可以了。否则,一个anon函数和一个命名函数没有太大的区别。当你有100个相同的匿名函数时,这是个问题。

    前任:

    $("#someID").click(function(){})
    

    没关系,

    for (var i in somelistofIDs) {
        $(i).click(function(){})
    }
    

    不是,因为您已经创建了100个匿名函数,而不是一个命名函数。

    编辑

    当然,如果您在一个闭包中包装一个函数调用,那么您做的是错误的,您只需传递函数本身。