/* * 判断变量类型 * Type.isXXX( obj ); */ var Type = {}; /* @type 注册类型 */ for( var i = 0, type; type = [ 'Array', 'String', 'Number' ][ i++ ]; ){ ( function ( type ) { Type[ 'is' + type ] = function ( obj ) { return Object.prototype.toString.call( obj ) === "[object " + type + "]"; } })( type ) } /* * AOP实现 * func() */ /* @beforefn 原函数执行以前的处理函数 */ Function.prototype.before = function ( beforefn ) { var _self = this; return function () { beforefn.apply( this, arguments ); return _self.apply( this, arguments ); } } /* @afterfn 原函数执行以后的处理函数 */ Function.prototype.after = function ( afterfn ) { var _self = this; return function () { var ret = _self.apply( this, arguments ); afterfn.apply( this, arguments ); return ret; } } var func = function () { console.log(2); } /* 包装 */ func = func.before(function () { console.log(1); }).after(function () { console.log(3); }) /* * curring 函数柯里化 */ /* @fn 传参长度为0时执行fn,不然将参数保存起来 */ var currying = function ( fn ) { var args = []; return function () { if ( arguments.length === 0 ){ return fn.apply( this, args ); }else{ [].push.apply( args, arguments ); return arguments.callee; } } }; var cost = ( function () { var money = 0; return function () { for (var i = 0, l = arguments.length ; i < l; i++ ) { money += arguments[i]; } return money; } })(); /* * uncurring */ //第一种 Function.prototype.uncurrying = function () { var _self = this; return function () { var obj = Array.prototype.shift.call( arguments ); return _self.apply( obj, argument ); } } //第二种 Function.prototype.uncurring = function () { var self = this; return function () { return Function.prototype.call.apply( self, argument ); } } /* * 函数节流:延迟执行一些高频率调用的函数,如window.onresize。限制函数被频繁调用。 */ var throttle = function ( fn, interval ) { var _self = fn, timer, isFirstTime = true; return function () { var args = arguments, _me = this; if( isFirstTime ){ //第一次调用不须要延迟 _self.apply( _me, args ); return isFirstTime = false; } if ( timer ){ //计时器还在,表示上一次的延迟执行尚未完成 return false; } timer = setTimeout(function () { clearTimeout( timer ); timer = null; _self.apply( _me, args ); }, interval || 500); } } /* * 分时函数:分批执行函数 */ /* $ary 创造节点时须要的参数 */ /* $fn 创造节点的逻辑 */ /* $count 每一批建立的节点数量 */ var timeChunk = function ( ary, fn, count ) { var obj, t; var start = function () { for( var i = 0; i < Math.min( count || 1, ary.length ); i++){ var obj = ary.shift(); fn( obj ); console.log(ary.length); } }; return function () { t = setInterval(function () { if ( ary.length == 0){ return clearInterval( t ); } start(); }, 200) } } /* * 惰性加载函数:减小重复却没必要要的方法耗时 addEvent示例 */ var addEvent = function ( elem, type, handler ) { if( window.addEventListener ){ addEvent = function ( elem, type, handler ) { elem.addEventListener( type, handler, false ); } }else if ( window.attachEvent ){ addEvent = function ( elem, type, handler ) { elem.attachEvent( 'on' + type, handler ); } } addEvent( elem, type, handler ); }