JavaScript 钩子机制

开发 前端
我们讨论过使用委托方法,把所有的回调函数注册到一个数组变量中,然后集中处理数组变量中的函数,这样就不会出现后面的函数冲击前面的函数问题。——因为原来回调函数就一个。

介绍

今天大家开会共同解决了一些javascript方面的问题,大家一起想办法,最终大家选择了钩子机制。

我把整个过程与大家分享一下,如果有误,请大家指正。 

问题

是这样的:我们的代码已经历史很久了,就这一套框架已经快5年了,在这中间大家也没有标准的代码规范,很随意的进行了代码编写,所以出现了很多问题:

1、如制造了很多重复的轮子。一套方法在多个文件中出现,大家调用的也五花八门,所以同事在一个方法(登录)中添加逻辑的时候发现,多个地方都有这样登录操作,修改起来非常麻烦。

2、代码结构混乱,分工不明确,本来公共类做的事情,导航类也做了类似的操作。

3、回调函数的使用,出现多个回调函数,从而出现一个回调函数会覆盖前一个回调函数的情况。

前两个问题,我首先把所有的入口文件(调用登录的方法)统一使用公共类中的方法,并且是一个入口一个入口的进行验证,保证代码的安全性、稳定性。并且不删除原有的方法,害怕有遗漏。然后计划是一个月之后,再进行一次全站搜索看是否有人还使用其他接口,然后删除那些重复的方法。

下面主要讨论第三个问题的解决方法。

委托方法

我们讨论过使用委托方法,把所有的回调函数注册到一个数组变量中,然后集中处理数组变量中的函数,这样就不会出现后面的函数冲击前面的函数问题。——因为原来回调函数就一个。

下面是具体的代码过程

 [[79008]]定义全局变量

  1. <head>  
  2.        <script type="text/javascript">  
  3.               var calls = [];       </script>  
  4. </head> 

[[79008]]注册方法

  1. function need_register(){  
  2. }  
  3. function test(){  
  4.       calls.push('need_register');  

  [[79008]]最终执行注册代码   

  1. function callback(){  
  2.      var calls = calls || [];  
  3.      if(calls.length === 0) return false;  
  4.      for(var i=0, iLen = calls.length; i < iLen; i++){  
  5.              calls[i].apply();  
  6.       }  
  7. }  

问题:

1、我们不难发现我们必须要有全局变量calls,我们知道全局变量不管在什么语种中都是最难维护的,因为到处都有可能修改里面的值,或改变整个全局变量。

2、在注册时候我们会在多个地方在calls中注册"函数名称",将来如果其他开发人员,看见这个变量会一头雾水的。——东一榔头,西一棒子。

总结:所以最终我们决定放弃这个方法。想出了下面的方法,我们管它叫钩子机制,也许名称上有点不够直观,呵呵大家就权当学习整个方法吧。

#p#

钩子机制

钩子机制是这样的,大家按照某一规则写一个方法(这个规则在方法名称上),然后页面加载完之前,统一执行所有的钩子函数。

注意callHooks方法,里面的局部变量s就是钩子函数名称中一定要有的内容。——这是使用钩子的方法!

  1. // 处理钩子的对象  
  2. var hook = (function(){  
  3.     return {  
  4.         timer:null,  
  5.         init:function(){  
  6.             this.callHooks('init');  
  7.         },    
  8.         callHooks:function(init){  
  9.             var s = "hook_" + init + '_event',  
  10.             f = [];   
  11.             for(var h in window){  
  12.                 if(h.indexOf(s) != 0) continue;  
  13.                 f.push(h);  
  14.             }     
  15.             this.hooksTimeout(f);  
  16.         },    
  17.         hooksTimeout:function(hooks){  
  18.             if(0 === hooks.length){  
  19.                 if(this.timer) clearTimeout(this.timer);  
  20.                 return;  
  21.             }     
  22.  
  23.             var h = hooks.shift();  
  24.             window[h].apply();  
  25.             window[h] = undefined;  
  26.  
  27.             window.setTimeout(this.hooksTimeout(hooks), 200);  
  28.         }     
  29.     }     
  30. }());  
  31.  
  32. // 钩子1  
  33. var hook_init_event_tpl_html = function(){  
  34.     document.getElementById('test').innerHTML = 'This is HTML!';  
  35. }  
  36.  
  37. // 钩子2  
  38. var hook_init_event_tpl_console = function(){  
  39.     console.log('This is console!');  
  40. }  
  41.  
  42. // ***在页面加载完之前调用,也就是在window.onload()之前  
  43. hook.init(); 

总结

很多问题,如果大家一起讨论是很有帮助的,在这过程中我们能学到很多东西,我们也可以在这过程中从牛人身上学到很多方法和思维过程,几乎每次的技术讨论会我都有不菲的收获——我不知道这是不是传说中的“头脑风暴”。

原文链接:http://www.cnblogs.com/baochuan/archive/2012/06/11/2542048.html

【编辑推荐】

  1. JavaScript马赛克遮罩图片幻灯片切换类
  2. 对开发者非常有用的JavaScript库
  3. 网易邮箱前端JavaScript编码规范
  4. javascript解决图片缩放及其优化
  5. 看JavaScript如何实现页面自适
责任编辑:张伟 来源: 川山甲的博客
相关推荐

2022-04-25 09:03:16

JavaScript代码

2011-08-24 13:51:56

JavaScript

2011-06-07 08:58:31

javascript

2011-07-04 13:12:04

JavaScript

2019-10-11 09:00:00

JavaScriptEvent Loop前端

2011-01-18 14:06:58

JavaScriptweb

2024-06-21 08:32:24

2021-12-07 08:01:33

Javascript 垃圾回收机制前端

2010-07-14 09:55:27

JavaScript

2018-03-15 16:45:47

前端JavaScriptthis

2018-08-07 14:45:52

编程语言JavaScripthtml

2015-03-06 09:00:23

Java高度关注内存使用机制

2017-02-06 07:34:26

JavaScrip

2009-08-12 10:29:31

C#实现全局钩子

2021-03-28 09:17:18

JVM场景钩子函数

2023-06-19 08:23:28

kubernetes容器

2023-11-10 16:31:31

2016-12-05 09:26:34

2020-09-21 09:58:01

Frida

2017-09-14 13:48:20

Vue.js机制应用
点赞
收藏

51CTO技术栈公众号