JS钩子的机制与实现

[什么是钩子]javascript

        接触过WordPress的朋友都知道,WP的程序中能够执行相似钩子的函数,固然是这PHP实现的钩子。在JavaScript中同样能够实现相似的功能。php

       用一句话来形容一下:钩子是将须要执行的函数或者其余一系列动做注册到一个统一的入口,程序经过调用这个钩子来执行这些已经注册的函数。java

[为何要用钩子]数组

不少朋友都会写一些函数,相似window.onload、$(document).ready等,并且一个页面不止一处写到相似的函数,如何让这些须要执行的函数在一个统一的入口执行(即页面只须要执行一个相似window.onload的函数)?app

这时咱们能够借助HOOK来实现,(以window.onload为例)将因此须要在页面加载的时候执行函数都注册到一个入口,如:函数

function func1()
{// ....
}function func2()
{// ....
}
hooks.addAction("loaded", func1);    // 添加函数
hooks.addAction("loaded", "func2");

上面表示在loaded钩子上挂了两个函数。而后执行这个钩子,如:this

window.onload = function()
{
hooks.doAction("loaded");
}

这样不管在以前挂多少函数hooks.addAction("loaded", function),在hooks.doAction("loaded")这里都被统一执行了。spa

[JS钩子如何实现].net

原理比较简单,定义一个hook数组,addAction时将函数push到hook数组,doAction时将hook数组里的函数逐一调用。prototype

function hooks()
{this.queue = new Array();
}
hooks.prototype.addAction = function(hook, func)
{this.queue[hook] = new Array();if(typeof func == 'function') {this.queue[hook].push(func);
} else if(typeof func == 'string') {this.queue[hook].push(this.window[func]);
}
}
hooks.prototype.doAction = function(hook)
{var parameters = Array.prototype.slice.call(arguments, 1);var functions = this.queue[hook];for(var i=0; i < functions.length; i++)
{this.call_user_func_array(functions[i], parameters);
}return true;
}
hooks.prototype.call_user_func_array = function(cb, parameters)
{if (typeof cb === 'string') {
func = (typeof this[cb] === 'function') ? this[cb] : func = (newFunction(null, 'return ' + cb))();
} else if (cb instanceof Array) {
func = ( typeof cb[0] == 'string' ) ? eval(cb[0]+"['"+cb[1]+"']") : func = cb[0][cb[1]];
} else if (typeof cb === 'function') {
func = cb;
}if (typeof func != 'function') {throw new Error(func + ' is not a valid function');
}if(typeof parameters == 'undefined') {var tmp_ary = [];var parameters = Array.prototype.slice.call(tmp_ary, 1); 
}return (typeof cb[0] === 'string') ? func.apply(eval(cb[0]), parameters) :.
( typeof cb[0] !== 'object' ) ? func.apply(null, parameters) : func.apply(cb[0], parameters);
}
相关文章
相关标签/搜索