V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaomajia008
V2EX  ›  程序员

是不是可以理解 javascript 的自定义事件就是函数调用?

  •  
  •   xiaomajia008 · 2014-04-15 13:50:04 +08:00 · 2792 次点击
    这是一个创建于 3874 天前的主题,其中的信息可能已经有所发展或是发生改变。
    js自定义事件

    xxx.bind('myevent',function(){});


    调用

    xxx.trigger('myevent');

    在我理解看来其实就是函数的调用啊...为什么要有自定义事件的概念呢? 有何更高级的用法?
    7 条回复    1970-01-01 08:00:00 +08:00
    zythum
        1
    zythum  
       2014-04-15 13:54:56 +08:00
    其实是个语法糖。用于解耦。
    NemoAlex
        2
    NemoAlex  
       2014-04-15 14:04:22 +08:00
    这个不是 JavaScript,是 jQuery
    没什么奇特的,现在用 .on 比较好
    yangg
        3
    yangg  
       2014-04-15 14:31:26 +08:00
    Events are a manifestation of the observer pattern.

    http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/
    jsonline
        4
    jsonline  
       2014-04-15 14:39:38 +08:00 via Android
    程序员通过添加中间层解决问题。
    这里的问题是多个模块相互发消息,中间层是事件系统。
    就是所谓的订阅发布模式。
    davepkxxx
        5
    davepkxxx  
       2014-04-15 17:38:04 +08:00
    Mutoo
        6
    Mutoo  
       2014-04-16 09:16:49 +08:00   ❤️ 1
    假设你有一个时钟模块,clock。一般情况你会这样写

    clock.tick = function() {
      // update time ...

      /* display time */
      $("#clock").val(clock.getTime());
    };

    这里的 $("#clock").val() 就是一个很直观的函数调用。

    但是这样做的话,这个模块和界面元素"#clock"产生了耦合(coupling)。
    也就是说,这段代码与一个叫"clock"的div产生了紧密关联,你没办法把它用在其它地方(当然除非你把"#clock"一起搬运)。

    为了让clock模块更具有通用性,需要为它解耦。目的是可以在不同的地方很方便使用这个模块。所以引入了一种设计模式,叫“观察者”模式。

    clock.tick = function() {
      // update time

      /* dispatch time */
      clock.trigger("tick", clock.getTime());
    };

    现在 clock 已经不关心它应该去更新哪些界面组件了。它要做的只是“告知”时间的变更。
    那么谁应该更新界面组件呢?当然是界面组件自己啊。他们可以主动“关心”时间变更这个事件,然后对自己的内容进行修改:

    clock.bind("tick", function(new_time){
      $("#clock").val(new_time);
    });

    于是这个 clock 模块与界面元素成功解耦,你可以把它用在不同的项目里面。我们也可以在同一个项目里很方便的增加一些新的“订阅者”:

    clock.bind("tick", function(new_time){
      console.log(new_time);
    });
    xgod
        7
    xgod  
       2014-04-16 19:16:24 +08:00   ❤️ 1
    简单理解:
    一个方法名则只能调用一个代码块,理解为:做一个行为。
    一个事件标识,可以绑定多个代码块,理解为:当发生什么事时,做一个行为或多个行为,当然也可以什么都不做。
    xxx.bind('myevent',function(){console.log('action1')});
    xxx.bind('myevent',function(){console.log('action2')});
    xxx.trigger('myevent'); // action1,acion2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5174 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:25 · PVG 17:25 · LAX 01:25 · JFK 04:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.