在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(); } } }