zoukankan      html  css  js  c++  java
  • JS和C# 里的闭包及闭包在事件中的使用

    在Javascript世界里,无所不用闭包及自定义事件, 自定义事件其实也是事先定义好一种规则

    ,当触发者被响应后执行的一段回调。下面看个例子

    function dothing(callBack){
        callBack();
    }
    dothing(function(){
      alert(1)
    });

    上面例子先执行dothing,然后执行里面的闭包(回调)过程,把function(){  alert(1)}做为

    参数传递过callBack,后callBack,就callBack(),其它就是执行子被传递的代码 这里用到了匿名函数,在JS中有时候也会用户这样(function(){alert(1)})(),这样后匿名函数

    会立马执行,再来说下自定义事件 步骤: 1)创建事件 var event = document.createEvent(type);

    type: 可以是DOM Level 2中的 HTMLEvents 也可以是 DOM Level 3中的 MouseEvent 可参考

    2) 初始化事件 event.initEvent(type, bubbles, cancelable);

    type: 自定义事件的名称 bubbles: 是否冒泡 cancelable: 是否可取消

    3) 侦听事件 target.addEventListener(type, listener, useCapture);

    type:初始化时注册的事件名称 listener:一般为事件触发的所要执行的function useCapture指出事件在冒泡还是捕获阶段执行 可参考

    4) 派发事件 bool = element.dispatchEvent(event);

    手动派发此事件,即可触发3中的listener 函数

    一个完整的例子:

    var evt = document.createEvent('Event');
    evt.initEvent('build', true, true); 
    elem.dispatchEvent(evt);  
    document.addEventListener('build', function(e){  
    }, false);

    在C#的世界里也完全可以像上面那样,思想是一样的,只是实现的过程不一样罢了

    private void  dothing(Action<bool> Hand)
    {
    
        //dothing here
    
    }
    private void go()
    {
    
       dothing((e)=>{
    
          //闭包如返回在这里进行操作
    });
    }

    在 事件中的使用

    1)先定义事件      public event Action Finished;//注意这里用的是Action类型,简化开发      然后在调用的地方      Finished();      最后执行事件的主体

     完整代码

     class Program
        {
            static void Main(string[] args)
            {
                t my = new t();
                my.Finished += my_Finished;
                //当条件成熟时,t类里触发do方法
                //这样就会执行到Finished事件了
                
    
            }
    
            static void my_Finished()
            {
                Console.WriteLine("这事件被调用了");
            }
        }
        class t
        {
            public event Action Finished;
            void Do()
            {
                Finished();
            }
            public t()
            {
                if (DateTime.Now.Year == 2013)
                {
                    Do();
                }
            }
        }
  • 相关阅读:
    poj 3255
    (DP) bzoj 2091
    (最短路) bzoj 2118
    (点双联通分量) poj 2942
    (树直径) bzoj 1509
    (离线处理+BFS) poi Tales of seafaring
    (并查集+DFS) poi guilds
    (记忆话搜索)POI Fibonacci Representation
    (DP) POI Bytecomputer
    (DP) bzoj 1296
  • 原文地址:https://www.cnblogs.com/gzalrj/p/3498098.html
Copyright © 2011-2022 走看看