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();
            }
        }
    }
原文地址:https://www.cnblogs.com/gzalrj/p/3498098.html