第一次接触jQuery.proxy()时感觉这个方法不实用,不明白它到底是个什么意思。今天来将jQuery官网上的解释进行一下翻译,顺便添加自己的理解和一些示例。proxy也可称为代理。

jQuery.proxy( function, context )                                       Returns: Function

通过这第一句话我们知道,jQuery.proxy传递的第一个参数是函数类型,第二个参数是上下文context,返回值也是一个函数。

JQuery API Document 上的描述是:

接受一个函数并且返回一个新的函数,这个函数总是包含着特定的上下文。

function:上下文将会被改变的函数

context函数的上下文设置到的一个新对象。注意:这里的上下文不是DOM对象,而是JS对象,并且要求context的类型是PlainObject(PlainObject是指包含一个或多个键值对的javascript对象,是jQuery对JS对象的一种定义,可以通过$.isPlainObject判断)。

看着这段说明似乎有点懵,例证一下

        var parent = {
text: "parent"
, show: function () {
alert(this.text);
}
}
var child = {
text: "child"
, show: function () {
alert(this.text);
}
}
var show = $.proxy(parent.show, child);
show();

在这个例子中,我写了两个对象parent和child,同时调用了代理函数$.proxy,返回了show函数。调用了一下show函数,发现alert出来的是“child”。

这时候你会惊奇的发现,用法很像javascript中的call方法。

parent.show.call(child);
//alert结果是"child"

那么我们得出第一条结论:jQuery.proxy会将第一个参数function托管个context对象,并且返回一个新函数,这个新函数的执行上下文是传入的context参数

继续看

首先看以一下proxy的其它几种参数列表

jQuery.proxy( context, name )

name:String类型,就是函数的名字

将上述例子改写可以实现相同的效果

var show = $.proxy(child, 'show');
show();

这里是将show函数的执行上下文设置为child.

jQuery.proxy( function, context [, additionalArguments ] )

jQuery.proxy( context, name [, additionalArguments ] )

additionalArguments:给函数传入的参数

这种方式有些像带参数的call函数

        var parent = {
text: "parent"
, show: function (pre) {
pre ? (pre += this.text) : pre = this.text;
alert(pre);
}
}
var child = {
text: "child"
, show: function (pre) {
pre ? (pre += this.text) : pre = this.text;
alert(pre);
}
}
var show = $.proxy(child, 'show', 'I am ');
show();

这种方法通常的使用场景是将事件处理函数附加到另一个新对象上去的时候,尽管返回的函数的执行上下文是新对象,但是可以通过原对象就可以解除新对象的函数绑定。

但是需要注意的是,jQuery事件绑定子系统会为每一个事件处理函数分配一个唯一的ID(在jQuery中是guid对象)用来跟踪它,这主要用来在特殊事件的解绑时使用。

即使事件绑定在不同的上下文对象上,通过jQuery.proxy返回的函数对jQuery来说也是唯一的。为了防止解绑事件初恋函数出错,最好使用唯一的命名空间来添加事件绑定函数和解除事件绑定函数(比如“click.Modal.data-api”,它会在事件绑定或解绑时,生成“data-api.Modal”的命名空间),而不需要在解绑时指定代理函数。

到jQuery1.6的时候,额外添加的函数会被传递到上下文对象改变的函数中。

到jQuery1.9的时候,当上下文对象context为null或者undefined的时候,被代理的函数也被称为这个代理的上下文对象context,这个时候jQuery.proxy的调用并没有改变传入函数的上下文对象了。

最新文章

  1. 解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
  2. 在Windows中安装NodeJS的正确姿势
  3. rpc框架之HA/负载均衡构架设计
  4. 简述cookie
  5. 如何彻底卸载Oracle
  6. oracle经典操作sql
  7. Gitlab 与 Git Windows 客户端一起使用的入门流程
  8. c# 集合ArrayList;特殊集合Stack、Queue
  9. 实用的PHP正则表达式
  10. oracle系统参数修改
  11. JSP与ASP.PHP的比較
  12. Web压力测试和手机App测试
  13. Linux进程-命令行参数和环境列表
  14. leetcode日记 HouseRobber I II
  15. Tenka 1 Computer Contest C-Align
  16. 51Nod--1384全排列
  17. 2-1 编写HelloWorld
  18. Python 中的垃圾回收机制--备忘
  19. OC Copy和Property
  20. iOS设计模式 - 模板

热门文章

  1. MySQL 忘记密码后的重置操作
  2. php对象中类的继承性访问类型控制
  3. HTML&CSS基础学习笔记1.5-添加常用标签
  4. 批处理更新svn
  5. sqlserver 数据库里面金额类型为什么不建议用float,实例告诉你为什么不能。
  6. linux 搭建lamp环境
  7. Wireshark "The NPF driver isn’t running…"(可见的驱动本质上是一个系统服务,使用net start 启动)
  8. 【转】Win7与Ubuntu 14.04双系统修改启动项顺序
  9. 符号表(Symbol Tables)
  10. c语言指针与结构体之内存动态分配