日期:2014-05-16  浏览次数:20367 次

[ExtJS3.2源码每天一小时]ExtJS对Function类的扩展(之九)
Ext对Function类的扩展主要包括方法:常见函数执行拦截器、创建回调函数、延迟函数执行。
Ext.apply(Function.prototype, {
   //函数执行拦截器 fcn-拦截器函数
  createInterceptor: function(fcn, scope){
        //this指代当前要加拦截器的function 下文简称this函数
        var method = this;
        //判断当前fcn拦截器是否是一个函数,如果是返回的是执行拦截器和this函数的一个新函数,如果不是返回的是this函数。
        return !Ext.isFunction(fcn) ?
                this :
                //下面这个function称作deal函数(依次执行拦截函数和this函数)
                function() {
                    //此处的this指的是deal函数
                    var me = this,
                    //arguments指代deal函数的参数
                    args = arguments;
                    //设置拦截器的拦截目标为deal函数
                    fcn.target = me;
                    //设置拦截器的正常方法为this函数
                    fcn.method = method;
                    //首先执行拦截器,如果拦截器不返回false,那么继续执行this函数,如果拦截器返回false,那么this函数将不执行。
                    return (fcn.apply(scope || me || window, args) !== false) ?
                            method.apply(me || window, args) :
                            null;
                };
    },
   //创建function特定参数的回调函数
   createCallback: function(){
        var args = arguments,
            method = this;
        return function() {
            return method.apply(window, args);
        };
    },
    //创建function指定参数的回调函数
     //obj指代的是作用域
     //args指代的是要回传给执行函数的参数,一旦指定args,并且appendArgs不传,那么就覆盖原有函数的参数;
     //appendArgs可以传两种类型 布尔值:代表是否追加参数 数字值:代表追加的位置
   createDelegate: function(obj, args, appendArgs){
        //保存当前函数的引用
        var method = this;
        return function() {
            //声明回调时传入的参数
            var callArgs = args || arguments;
            //是否追加参数,即createDelegate传的args参数是否追加到当调用回调函数时传入的参数数组里面
            if (appendArgs === true){
                //先将回调函数的参数转为数组形式,因为arguments并不是一个数组
                callArgs = Array.prototype.slice.call(arguments, 0);
                //将args参数追加到回调参数中
                callArgs = callArgs.concat(args);
            }
            //如果appendArgs是数字
            else if (Ext.isNumber(appendArgs)){
                //先将回调函数的参数转为数组形式,因为arguments并不是一个数组
                callArgs = Array.prototype.slice.call(arguments, 0); 
                //从appendArgs位置向callArgs插入args参数
                var applyArgs = [appendArgs, 0].concat(args); 
                Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
            }
            //执行函数
            return method.apply(obj || window, callArgs);
        };
    },
    //延迟执行函数
     //millis:延迟执行的毫秒数
     //obj:作用域
     //args:创建回调函数的参数
     //appendArgs:是否追加参数
   defer: function(millis, obj, args, appendArgs){
        //创建回调函数
        var fn = this.createDelegate(obj, args, appendArgs);
        //应用延迟
        if(millis > 0){
            //millis后执行fn
            return setTimeout(fn, millis);
        }
        //如果millis小于零或者是其他非数字值,直接执行fn
        fn();
        return 0;
    },
    //创建函数之后顺序执行的一个函数
    createSequence : function(fcn, scope){
        var method = this;
        return (typeof fcn != 'function') ?
                this :
                function(){
                    var retval = method.apply(this || window, arguments);
                    fcn.apply(scope || this || window, arguments);
                    return retval;
                };
    }
});