`
ASCII
  • 浏览: 31003 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Extjs4 源码-Ext.Function解读

阅读更多
Ext.Function = {

    
    flexSetter: function(fn) {
        return function(a, b) {
            var k, i;

            if (a === null) {
                return this;
            }

            if (typeof a !== 'string') {
                for (k in a) {
                    if (a.hasOwnProperty(k)) {
                        fn.call(this, k, a[k]);
                    }
                }

                if (Ext.enumerables) {
                    for (i = Ext.enumerables.length; i--;) {
                        k = Ext.enumerables[i];
                        if (a.hasOwnProperty(k)) {
                            fn.call(this, k, a[k]);
                        }
                    }
                }
            } else {
                fn.call(this, a, b);
            }

            return this;
        };
    },

   
    bind: function(fn, scope, args, appendArgs) {
        var method = fn,
            applyArgs;

        return function() {
            var callArgs = args || arguments;

            if (appendArgs === true) {
                callArgs = Array.prototype.slice.call(arguments, 0);
                callArgs = callArgs.concat(args);
            }
            else if (Ext.isNumber(appendArgs)) {
                callArgs = Array.prototype.slice.call(arguments, 0); 
                applyArgs = [appendArgs, 0].concat(args); 
                Array.prototype.splice.apply(callArgs, applyArgs); 
            }

            return method.apply(scope || window, callArgs);
        };
    },

    
    pass: function(fn, args, scope) {
        if (args) {
            args = Ext.Array.from(args);
        }

        return function() {
            return fn.apply(scope, args.concat(Ext.Array.toArray(arguments)));
        };
    },

    
    alias: function(object, methodName) {
        return function() {
            return object[methodName].apply(object, arguments);
        };
    },

    
    createInterceptor: function(origFn, newFn, scope, returnValue) {
        var method = origFn;
        if (!Ext.isFunction(newFn)) {
            return origFn;
        }
        else {
            return function() {
                var me = this,
                    args = arguments;
                newFn.target = me;
                newFn.method = origFn;
                return (newFn.apply(scope || me || window, args) !== false) ? origFn.apply(me || window, args) : returnValue || null;
            };
        }
    },

    
    createDelayed: function(fn, delay, scope, args, appendArgs) {
        if (scope || args) {
            fn = Ext.Function.bind(fn, scope, args, appendArgs);
        }
        return function() {
            var me = this;
            setTimeout(function() {
                fn.apply(me, arguments);
            }, delay);
        };
    },

    
    defer: function(fn, millis, obj, args, appendArgs) {
        fn = Ext.Function.bind(fn, obj, args, appendArgs);
        if (millis > 0) {
            return setTimeout(fn, millis);
        }
        fn();
        return 0;
    },

    
    createSequence: function(origFn, newFn, scope) {
        if (!Ext.isFunction(newFn)) {
            return origFn;
        }
        else {
            return function() {
                var retval = origFn.apply(this || window, arguments);
                newFn.apply(scope || this || window, arguments);
                return retval;
            };
        }
    },

    
    createBuffered: function(fn, buffer, scope, args) {
        return function(){
            var timerId;
            return function() {
                var me = this;
                if (timerId) {
                    clearInterval(timerId);
                    timerId = null;
                }
                timerId = setTimeout(function(){
                    fn.apply(scope || me, args || arguments);
                }, buffer);
            };
        }();
    },

    
    createThrottled: function(fn, interval, scope) {
        var lastCallTime, elapsed, lastArgs, timer, execute = function() {
            fn.apply(scope || this, lastArgs);
            lastCallTime = new Date().getTime();
        };

        return function() {
            elapsed = new Date().getTime() - lastCallTime;
            lastArgs = arguments;

            clearTimeout(timer);
            if (!lastCallTime || (elapsed >= interval)) {
                execute();
            } else {
                timer = setTimeout(execute, interval - elapsed);
            }
        };
    }
};


Ext.defer = Ext.Function.alias(Ext.Function, 'defer');


Ext.pass = Ext.Function.alias(Ext.Function, 'pass');


Ext.bind = Ext.Function.alias(Ext.Function, 'bind');
 

       1.alias(object, methodName):将object的mothodName方法赋予给指定对象。

 

       2.bind(fn,scope,args,appendArgs):将fn函数以scope作为上下文以args作为参数进行调用。

 

 

       在JavaScript中,函数和其他值一样,也是数据,因此,它们可以从函数返回,被赋予给对象属性,存储在数组中,等等。

       考虑下面的例子,其中包含了一个函数,他返回一个嵌套的函数。每次调用这个函数,它都返回一个函数。返回的函数的JavaScript代码总是相同的,但是,它所创建的作用域略为不同,因为外围函数的参数值在每次调用中都不同(也就是说,外围函数的每次调用的作用域链上,有一个不同的调用对象)。如果把返回的函数存储在一个数组中,然后来调用其中的每一个,将会看到每次返回一个不同的值。既然每个函数包含同样的JavaScript代码,并且每段代码都是从相同的作用域调用的,那么,唯一可能导致不同返回值的因素就是函数定义所在的作用域。

function makefunc(x) {
    return function() {return x;}
}

var  a = [makefunc(0), makefunc(1), makefunc(2)];

alert(a[0]());
alert(a[1]());
alert(a[2]());
分享到:
评论
1 楼 ybwantao 2013-07-12  
如果绑定的是一个ajax函数 而且正在请求就会出问题

相关推荐

    3------通过实例学习------Ext.js------.docx

    <script src="extjs/ext-all-debug.js"> ;width:320px;height:240px;border:1px solid #ccc;background:#ffc;padding:5px;line-height:25px;font-size:14px"> Ext.onReady(function() { Ext.Msg.show({ ...

    Extjs源码之--Ext事件机制/继承关系

    在“Extjs源码之--Ext事件机制/继承关系”中,我们将深入探讨EXTJS如何处理事件以及其类层次结构。EXTJS的事件处理主要由EventManager.js这个文件负责,它是EXTJS事件系统的基础。 首先,EXTJS的事件机制基于观察者...

    Ext.Ajax.request2.x实现同步请求

    在EXTJS库中,`Ext.Ajax.request`是用于发送Ajax请求的核心方法,它支持异步和同步操作。本文将详细解析如何利用`Ext.Ajax.request`实现同步请求,并探讨其背后的原理和注意事项。 首先,我们需要理解Ajax的本质,...

    Ext.Ajax.request跨域

    标题"Ext.Ajax.request跨域"指出我们将探讨如何使用ExtJS库中的Ajax模块进行跨域请求。Ext.Ajax.request是ExtJS提供的一种发起Ajax请求的方式,它允许开发者向服务器发送异步HTTP请求。然而,由于浏览器的同源策略...

    EXTJS3 Ext.PagingToolbar() 快捷键应用

    在EXTJS3中,`Ext.PagingToolbar()` 是一个非常重要的组件,用于在大量数据的网格或视图中实现分页功能。这个组件允许用户轻松地浏览和操作大量的记录,而不需要一次性加载所有数据,从而提高了应用程序的性能和用户...

    Extjs4[1].0学习指南(简体中文)

    - **下载包**:下载最新的Extjs4.x版本,通常包括源码、API文档、示例等。 #### 二、搭建Extjs4开发环境 - **开发工具准备**: - **MyEclipse**:确保已安装MyEclipse IDE。 - **Tomcat**:确保已安装并配置好...

    Ext.Ajax.request 小问题收集

    EXTJS源码阅读可以帮助开发者更深入地理解其工作原理,从而更好地定制和优化应用。 在实际项目中,我们通常会将EXTJS库文件(如`ext-basex.js`)与其他EXTJS组件和应用代码一起使用。这些库文件包含了EXTJS框架的...

    Ext教程_javakc

    2. **引入核心库**:通过 `<script>` 标签引入 `extjs/adapter/ext/ext-base.js` 和 `extjs/ext-all.js`。 3. **编写 JavaScript 代码**:使用 Ext 提供的方法编写业务逻辑。 例如,以下代码展示了如何在页面加载...

    很好的Extjs学习文档

    Ext.onReady(function(){ Ext.Msg.alert('HelloWord', 'Hello Word!'); }); ``` **Ext类库简介** Ext JS的类库由底层API、控件和实用工具三部分构成: 1. **底层API(core)**:提供DOM操作、查询、事件处理和DOM...

    ExtJS 3.2的中文参考手册

    - **遍历节点**: 获取到的节点列表可以通过循环来进一步处理,例如:`Ext.each(nodes, function(node) { ... });`。 #### 5. **响应事件** - **绑定事件**: 通过 `addListener` 方法为DOM元素绑定事件监听器,例如...

    Extjs简明总结(教程)

    2. `build` 目录:存放经过压缩的ExtJS源码,适用于生产环境。 3. `docs` 目录:提供了详细的API帮助文档,是学习和查阅ExtJS功能的重要资源。 4. `examples` 目录:包含了许多实际的应用示例,帮助你理解如何运用...

    ExtJS 设计模式之一.docx

    在ExtJS的源码中,可以看到许多类似的设计: ```javascript // Ext.DomHelper 的单例实现 Ext.DomHelper = (function () { // 私有变量和方法 var privateVars; return { // 公共API createDiv: function ...

    ext入门学习.pdf

    4. 完善的事件处理:ExtJS拥有强大的事件处理系统,允许开发者绑定各种事件,实现组件间的交互和响应式设计。 开始使用ExtJS,首先需要进行环境配置。下载最新版的ExtJS库,了解其目录结构,例如`resources`目录...

    ext入门学习文档

    - `ext-all.js`是压缩后的源码,而`ext-all-debug.js`则是未压缩的版本,适用于调试。 - 开发时需要将`resources`包中的CSS和图像文件放到`common`目录下,并将`ext-all.js`和`adapter/ext/ext-base.js`放到`js`...

    Extjs6.x插件,双击关闭选项卡(js源码)

    例如,`ext-tab-close-plugin.js` 的源码可能会包含以下内容: ```javascript Ext.define('MyApp.plugins.CloseTabOnDoubleClick', { extend: 'Ext.util.Plugin', alias: 'plugin.closeTabOnDoubleClick', init:...

    ExtJs部署及使用方法

    为了正确地安装ExtJs库,首先需要将ExtJs的源码包放置到项目的WebRoot目录下,即项目的根目录。在安装过程中,需要创建以下文件夹结构: ``` -- WebRoot -- extEngine -- adapter -- builder -- resources -- ...

    ext使用--Panel和iframe联合使用时页面高度的解决方法

    Ext.onReady(function() { var iframe = Ext.create('Ext.ux.IFrame', { src: 'http://example.com', plugins: ['miframe'] // 使用miframe插件 }); var panel = Ext.create('Ext.Panel', { items: [iframe]...

    Ext框架简介.ppt

    Ext.onReady(function(){ Ext.Msg.alert('helloWord','Hello Word!'); }); ``` EXT框架的基础主要包括底层API、控件和实用工具三大部分。底层API提供了DOM操作、事件处理、DOM查询等基本功能,是其他所有组件的...

    解决ext下拉列表全选和去全选功能

    标签中的“源码”意味着你需要理解EXTJS的底层工作原理,而“工具”则可能是指EXTJS提供的各种组件和辅助方法。在实际项目中,你可能需要结合CSS(jscss文件)来自定义下拉列表的样式,使其更符合应用的视觉设计。 ...

    ExtJS中editable-column-tree组件的使用 示例

    在IT行业中,ExtJS是一个广泛使用的JavaScript库,用于构建富客户端Web应用程序。它提供了一整套功能丰富的组件,包括表格、树形视图、图表等,使得开发人员能够创建复杂且用户友好的界面。本篇将详细介绍ExtJS中的...

Global site tag (gtag.js) - Google Analytics