临时详解下下面的代码:
// 这个函数可以在你执行完原函数以后,执行一下自定义的函数。
createSequence : function( fcn , scope ) {
if ( typeof fcn != "function" ) {
return this;
}
var method = this;
return function() {
var retval = method.apply( this || window , arguments );
fcn.apply( scope || this || window , arguments );
return retval;
};
}
这个代码为什么要这么设计呢?
先看API中关于这个方法的使用方法:
var sayHi = function(name){ alert('Hi, ' + name);}
sayHi('Fred'); // alerts "Hi, Fred"
var sayGoodbye = sayHi.createSequence(function(name){
alert('Bye, ' + name);
});
sayGoodbye('Fred'); // both alerts show
最终createSequence需要返回一个function类型的方法所以在方法的定义中return 了一个function。
且根据方法定义,该方法的第一个参数必须是一个function类型的对象,所以在方法的最开始首先判断该方法第一个参数的参数类型若不为
function则放弃后续操作并将createSequence方法的调用者返回去。这样类似于var sayGoodbye =
sayHi.createSequence({});在执行sayGoodbye();时等价于调用sayHi();
这里还有一个待解决的问题那就是如何将sayHi保存起来,因为根据createSequence的定义。该方法需要先调用sayHi()而后调用里面的那个匿名function。
且因为一定要返回一个function所以下面必须renturn function(){。。。。。}这里请注意一点,返回的function中的this和return外面的this并不是同一个对象。
我们看代码:var mathod = this; 返回的function中: var retval = method.apply( this || window , arguments );
这2个this是不一样的,return外面的this表示调用createSequence的对象,根据上面的例子就是sayHi这个function。而return中的this代表调用return的function的那个对象,也就是调用sayHi的那个对象
而不是sayHi本身
。
所以必须在return function之前先把代表sayHi的function也就是那个this用一个内部变量缓存起来利用闭包供return的function执行时使用。
所以才有了var retval = method.apply( this || window , arguments );的写法。根据上面的DEMO我们重新给方法定义添加一些注释以帮助理解2个不同的this:
// 这个函数可以在你执行完原函数以后,执行一下自定义的函数。
createSequence : function( fcn , scope ) {
//这里的fcn就是DEMO中的那个<strong>function</strong>(name){alert(<em>'Bye, '</em> + name);}
if ( typeof fcn != "function" ) {
return this;
}
var method = this;//这个this为sayHi (类型为function)
return function() {
var retval = method.apply( this || window , arguments );//这个this为调用sayHi的对象也就是window
//上面那一句相当于调用sayHi(/* 这个地方应该是arguments 也就是 'Fred' */);
fcn.apply( scope || this || window , arguments );
//上一句相当于执行function(name){alert('Bye, ' + name);}('Fred')
return retval;//根据定义返回sayHi执行结果
};
}
分享到:
相关推荐
资料:包括extjs2.0源码
ExtJS是一个Ajax框架,是一个用javascript写的,用于在客户端创建丰富多彩的web应用程序界面。ExtJS可以用来开发RIA也即富客户端的AJAX应用.ExtJS主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。...
ExtJS3.0 源码分析与开发实例宝典
NULL 博文链接:https://gaobo.iteye.com/blog/479965
Extjs教程源码 介: ***************第一部分基础知识**************** 第一讲: EXTJS4.0概述和HelloWorld程序 第二讲: EXTJS4.0的新特性 第三讲: EXTJS4.0数据模型——Model 第四讲: EXTJS4.0的数据代理——Proxy ...
资源名称:Ext JS源码分析与开发实例宝典内容简介:本书全面系统地剖析了ExtJS 3.0的架构设计原理。通过对源码的“抽丝剥茧”,读者可以掌握Ext JS架构的精妙,从原理层面用活Ext JS。此外,本书还提出了大量的解决...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
这个是《ExtJS源码分析与开发实例宝典》高清版本,是本人花钱买来的,所以分享给大家,希望大家喜欢,由于本人一次只能上传60M大的文件(试了好多次,每次都上传到99%就不动了,还以为csdn在后台审核内容呢,害我电脑...
extJS myeclipse源码示例
extjs 源码,有兴趣的可以学习下
[02]EXTJS4.0的新特性.003.zip (14.41M)[02]EXTJS4.0的新特性.002.zip (50.00M)[02]EXTJS4.0的新特性.001.zip 第三讲:extjs4.0数据模型--Model(附件较大做了分包压缩大家只要下载2个包运行001就ok了) [03]EXTJS...
一个extjs的源码包.其中包括extjs的例子和文档.
ExtJS源码分析与开发实例宝典完整版 1、JS画图部分代码在IE8上看不到效果,因为IE8不支持VML。 2、扩展的组件为作者独立完成,仅供学习之用,一些组件并没有经过严格的测试。 如果需要用到项目之中,请自行测试。 ...
extjs4源码分享
Ext+JS源码分析与开发实例宝典 是extjs3.0的学习书 书得内容很不错。深入解析extjs 资源是pdf文档. 本人自己还做了pdf的完整书签目录,便于方便和阅读. 文档比较大,一共压缩成12卷.需12卷全部下载完。 就第一个...
《ExtJS源码分析与开发实例宝典》是一本不错的关于ExtJS开发实践的教程,特附上源码,与各位共享,谢谢。
ext js2.3的例子里面包含extjs从入门到精通所有需要。
extjs4.0 技术中文视频讲解,内容非常的全,而且讲的也不错,这是第一部分,里面有下载地址 可用迅雷下载。 第一讲:extjs4.0概述和HELLO WORD程序 第二讲:extjs4.0的新特性 第三讲:extjs4.0数据模型--Model 第...