1.call是js自带的方法,长在Function对象上
function b(v){
alert(this.temp+" "+v);
}
b.call({temp:'abc'},'hello');
第一个参数是给b function的this作用域赋值,后面那个是b 的参数
2.createDelegate()是Ext自己扩展的方法,同样是长在Function对象上的,这个方法的作用是返回一个匿名方法的引用,通常用来改变作用域
function b(v){
alert(this.temp+" "+v);
}
Function.prototype.createDelegate=function(scope,params){
var _fun = this;
return function(){
_fun.apply(scope,params);
};
}
var fun = b.createDelegate({temp:'abc'},['hello']);
fun();
关于回调函数指定参数问题,由来已久,extjs简洁优雅完美的解决了这个问题,今天来学习一下(不推荐 createCallback
)
createDelegate ( [Object obj ] , [Array args ] , [Boolean/Number appendArgs ] ) : Function
返回一个函数, 这个函数调用原函数,原函数中的this指向obj ,关于这个函数的参数由 appendArgs 指定 :
如 function2=function1.createDelegate(obj,args,appendArgs);
function2 call function1 ,function1 中的 this == obj
1. appendArgs falsy
那么 调用
function2时传的参数被忽略,args数组参数作为function1的参数运行。
2. appendArgs === true
那么
调用
function2时传的参数放在args数组前面合成一个新的数组,作为function1的参数运行。
3.typeof appendArgs == 'Number'
假设 调用 function2时传的参数 为 array1 (注意要 slice 为 真正的 Array)
那么将 args 数组插入到 array1 的指定 appendArgs位置 (利用 splice( appendArgs,0 ))
然后再把最终数组 作为function1的参数运行。
示例使用代码:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
lang
=
"en"
xml:lang
=
"en"
>
-
<
head
>
-
<
title
>
createDelegate测试
</
title
>
-
-
<
script
type
=
"text/javascript"
src
=
"javascript/ext-base.js"
>
</
script
>
-
<
script
type
=
"text/javascript"
src
=
"javascript/ext-core.js"
>
</
script
>
-
-
-
-
<
script
type
=
"text/javascript"
>
-
//<![CDATA[
-
-
Ext.onReady(function() {
-
function action_ba(info) {
-
alert(this.dom.innerHTML);
-
alert(info);
-
}
-
-
function action_bb(e,this_,o,info) {
-
alert(this.dom.innerHTML);
-
alert(e.type+' '+info);
-
}
-
-
function action_bc(info,e) {
-
alert(this.dom.innerHTML);
-
alert(info +' '+e.type);
-
}
-
-
Ext.get('action_a').on('click',action_ba.createDelegate(Ext.get('action_a'),['自定义参数覆盖event系列参数']));
-
-
Ext.get('action_b').on('click',action_bb.createDelegate(Ext.get('action_b'),['自定义参数在最后'],true));
-
-
Ext.get('action_c').on('click',action_bc.createDelegate(Ext.get('action_c'),['自定义参数在第一位'],0));
-
-
});
-
//]]>
-
-
</
script
>
-
-
</
head
>
-
<
body
>
-
-
<
button
id
=
'action_a'
>
测试覆盖参数
</
button
>
-
<
button
id
=
'action_b'
>
测试添加参数
</
button
>
-
<
button
id
=
'action_c'
>
测试插入参数
</
button
>
-
-
-
-
-
-
-
-
</
body
>
-
</
html
>
附录:Extjs 实现代码
-
Function.prototype.createDelegate =
function
(obj, args, appendArgs){
-
var
method =
this
;
-
return
function
() {
-
var
callArgs = args || arguments;
-
if
(appendArgs ===
true
){
-
callArgs = Array.prototype.slice.call(arguments, 0);
-
callArgs = callArgs.concat(args);
-
}else
if
(
typeof
appendArgs ==
"number"
){
-
callArgs = Array.prototype.slice.call(arguments, 0);
-
-
var
applyArgs = [appendArgs, 0].concat(args);
-
-
Array.prototype.splice.apply(callArgs, applyArgs);
-
-
}
-
return
method.apply(obj || window, callArgs);
-
};
-
}
分享到:
相关推荐
NULL 博文链接:https://yiminghe.iteye.com/blog/394170
10.8 EXT中的Ajax .........................................246 10.8.1 最容易看到的Ext.Ajax ........246 10.8.2 Ext.lib.Ajax是更底层的封装....247 10.9 关于scope和createDelegate() ....247 10.10 DWR与EXT...
概述 本文涉及到的反射优化的途径有如下两种: 通过Delegate.CreateDelegate()创建委托进行优化 通过.NET4的动态运行时进行优化 如果您还知道其他更加有效的优化途径,请不吝赐教! 准备工作 今天我们总计要对比五...
c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); _constrcache.Add(objtype, c); } else // structs { DynamicMethod dynMethod = new DynamicMethod("_", Method...
第五次作业函数第一题--
本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。
机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip
python烟花代码
附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。
商业化产品经理,到底如何实现产品商业化?.docx
Panduit 工业以太网部件内部销售指南
在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。
常用品牌EPLAN部件库
单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌
Q1.ipynb
(自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip
Bematech 激光扫描器用户手册
激励视频接入文档.pdf
java jdk1.8 202版本下载window linux打包
Lite Beam M5快速指南