1、首先先看一下,jQuery的proxy的官方文档中的解释
函数名称 | 返回值/类型 |
jQuery.proxy(function,context) | Function |
其中:
proxy(function,context),中的参数说明如下:
(1)、function:
类型:Function
说明:The function whose context will be changed.(这句话的含义为:作用于上下文(context)的方法,会使得上下文发生变化---(其实这句话是一句废话,一个方法作用于某个东西,必然会使该“东西”发生变化))。
(2)、context。
类型:PlainObject
说明:The object to which the context (this
) of the function should be set.
//-“The object”是指context。所以本句话的意思是指:参数context就是方法(function)的上下文(this)。
2、举例说明
这个例子是jQuery官网的上的例子,在这里
<!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> </head> <body> <p><button type="button" id="test">Test</button></p> <div id="log"></div> <script> var me = { type: "zombie", test: function(event) { /* Without proxy, `this` would refer to the event target */ /* use event.target to reference that element. */ /*如果不使用proxy方法,‘this’关键字将会是事件对象的target。*/ var element = event.target; $(element).css("background-color", "red"); /* With proxy, `this` refers to the me object encapsulating */ /* this function. */ /*若使用了proxy,则上下文中的this,将会是‘me’*/ $("#log").append( "Hello " + this.type + "<br>" ); $("#test").off("click", this.test); } }; var you = { type: "person", test: function(event) { $("#log").append( this.type + " " ); } }; /* execute you.test() in the context of the `you` object */ /* no matter where it is called */ /* i.e. the `this` keyword will refer to `you` */ var youClick = $.proxy( you.test, you ); /* attach click handlers to #test */ $("#test") /* this === "zombie"; handler unbound after first click */ .on( "click", $.proxy( me.test, me ) ) /* this === "person" */ .on( "click", youClick ) /* this === "zombie" */ .on( "click", $.proxy( you.test, me ) ) /* this === "<button> element" */ .on( "click", you.test ); </script> </body> </html>
通过这个例子,就可以知道:this关键词一般是指event.target,即事件的对象。但是通过proxy方法,可以改变this关键字所指的事件对象。这也就是context参数的含义。
通过function,作用于context,使其context发生改变。
在《Learning jQuery(third Edition)》中附录C中,对proxy的定义为:
创建(返回)一个在指定上下文中执行的新方法
个人理解:
在这个句话中:
指定上下文:是指:proxy中的context参数。
执行:是指proxy中的function参数。
所以proxy方法的目的是直接指定上下文,然后定义的function作用于该上下文(this)
3、proxy使用目的
举例说明:
代码-1
$('#myElement').click(function() { // In this function, "this" is our DOM element. $(this).addClass('aNewClass'); });在代码-1中,点击myElement,则该元素(myElement)将会添加aNewClass样式类。
$('#myElement').click(function() { setTimeout(function() { // 将会出问题,this将不是我们想要的element。 $(this).addClass('aNewClass'); }, 1000); });但是这样使用,就会出现问题。文中的‘this’,不是ID为myElement元素,而是window。
$('#myElement').click(function() { // ------------------v--------give $.proxy our function, setTimeout($.proxy(function() { $(this).addClass('aNewClass'); // Now "this" is again our element }, this), 1000); // ---^--------------and tell it that we want our DOM element to be the // value of "this" in the function });
3、参考资料
1、关于proxy的一些博客是不错的。
2、stackoverflow中的问答:
3、一个不错的讲解proxy的视频。(是英文的)
4、jQuery中proxy的源代码(呵呵,没看,仅仅是贴在这了)
01 /* jQuery 源码之 proxy: 02 使用 apply 形式, 执行回调函数. 03 */ 04 jQuery.proxy = function( fn, proxy, thisObject ) { 05 if ( arguments.length === 2 ) { 06 // jQuery.proxy(context, name); 07 if ( typeof proxy === "string" ) { 08 thisObject = fn; 09 fn = thisObject[ proxy ]; 10 proxy = undefined; 11 12 /* 转化结果: 13 thisObject -> context 14 fn -> name 15 proxy -> undefined 16 */ 17 } 18 // jQuery.proxy(name, context); 19 else if ( proxy && !jQuery.isFunction( proxy ) ) { 20 thisObject = proxy; 21 proxy = undefined; 22 } 23 } 24 if ( !proxy && fn ) { 25 /* 使用 proxy 保证 函数执行时, context 为指定值 */ 26 proxy = function() { 27 return fn.apply( thisObject || this, arguments ); 28 }; 29 } 30 // Set the guid of unique handler to the same of original handler, so it can be removed 31 if ( fn ) { 32 proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; 33 } 34 // So proxy can be declared as an argument 35 return proxy; 36 }
【最后】:不足之处,请批评与指正,多谢!
相关推荐
首先,我们需要理解`com.sun.proxy.$Proxy`类的作用。这是Java动态代理机制生成的类,当我们在代码中使用了接口的代理对象时,JVM会创建这个代理类来实现对原始接口方法的拦截和增强。例如,Spring AOP(面向切面...
同时,理解代理服务的工作原理,如如何处理请求和响应,以及如何在客户端和服务器端进行交互,对于开发和维护GIS应用至关重要。 在资源包`resource-proxy-1.0`中,可能包含了这些代理服务的源代码、配置示例以及...
3. 事件处理:jQuery的事件系统通过$.event.add和$.event.remove管理事件监听,$.proxy确保回调函数在正确的上下文中执行。 4. 动画效果:jQuery的动画功能如fadeIn、slideToggle等,底层实现依赖于setTimeout和...
7. **其他API改进**:还包括对$.proxy(), $.extend(), $.grep()等多个函数的改进,使它们更强大、更易用。 jQuery 1.7的API文档(jQuery 1.7_20111204.chm)详细列出了所有可用的函数、方法和属性,以及它们的参数...
`$.proxy()`方法是1.7引入的一个实用工具,它允许开发者固定一个函数的上下文(this值),无论何时调用该函数,`this`总是指向预设的对象,这对于事件处理和回调函数特别有用。 9. **$.each()的优化** `$.each()`...
jQuery还提供了一些实用工具函数,如$.trim()用于去除字符串首尾空白,$.extend()用于合并对象,$.inArray()检查元素是否在数组中,$.proxy()确保函数在指定上下文中调用。 压缩包中的124种效果可能包括上述各个...
`$.proxy`函数用于确保函数在特定上下文中调用,这对于事件处理尤其有用。它可以保持函数的作用域,即使函数在其他对象内部调用。例如: ```javascript var obj = { counter: 0, increment: function() { ...
4. **$.proxy**: 优化了$.proxy,使其可以处理未定义的上下文(context)。 5. **动画改进**: 添加了`.stop(true, true)`,使动画立即停止并跳至末态。 ### jQuery 1.8 版本 #### 1.8 版本更新要点 1. **$.ajax...
4. **事件处理**:事件绑定功能得到了加强,$.event特殊事件和$.proxy()函数的引入,使得事件处理更加灵活,可以更好地处理冒泡和委托事件。 5. **动画效果**:jQuery 1.2增强了动画效果的控制,如animate()方法...
1. **理解HiSuite Proxy原理**: - HiSuite Proxy是一种允许用户通过代理服务器来操作手机固件的工具,主要用于降级等场景。 - 正常情况下,用户通过HiSuite连接手机后,可以从华为的官方服务器下载相应的固件进行...
Python是一种广泛使用的高级编程语言,尤其在Web开发、数据分析、人工智能等领域有着重要应用。在Python的生态系统中,存在大量的第三方库来扩展其...正确理解和使用这个库,可以极大地提升Python应用的效率和质量。
在上面的例子中,`proxy_obj`是`MyClass`的一个代理实例,调用`get_value`方法时,实际上是调用了`original`对象的方法。 **5. 兼容性与版本** `zope.proxy-4.2.1-py3.3-win-amd64.egg`这个文件表明该库版本为...
- **$.proxy()**:创建一个函数,其上下文(this)被设置为指定的对象。 **3. jQuery 1.8.2 的改进与变化:** - **$.support**:添加了一些新的浏览器特性检测。 - **$.Callbacks()**:创建可配置的回调函数队列,...
此外,对于事件处理,$.proxy()函数的引入使得函数上下文的绑定更为简单,解决了在回调函数中正确引用this的问题。 两个版本的汉化手册,jQuery1.11.3 中文手册.chm和jQuery1.7 中文手册.chm,为中文开发者提供了...
3. **Java动态代理**:基于`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`,实现对目标对象的代理,用于拦截方法调用。 综上所述,`NoSuchMethodException`是Java编程中需要关注的一个重要异常...
同时,$.proxy()函数可以确保事件处理函数内的this指向正确,解决了JavaScript中this上下文的问题。 动画效果是jQuery的一大亮点。$.animate()函数可以实现平滑的CSS属性过渡,配合.stop()和.clearQueue()可以精确...
`$.proxy` 函数允许开发者固定一个函数的上下文(即`this`值),在1.7版本中,它支持第二个参数,用于指定要绑定到的函数名,这在处理匿名函数时非常有用。 #### 1.3 `.delegate()` 与 `.live()` 合并为 `.on()` `...
- **$.proxy()**:创建一个新的函数,保持原函数的上下文,避免this指向问题。 **总结** jQuery 1.2作为AJAX开发的利器,其简洁的API和强大的功能使得网页动态交互和DOM操作变得简单。无论是初学者还是经验丰富的...
在jQuery 1.4.1中,`$.extend()`用于合并对象,`$.each()`遍历数组或对象,`$.proxy()`确保函数的上下文正确,这些都是常用的工具函数。此外,`$.support`属性提供了浏览器特性的检测,便于进行跨浏览器的兼容性开发...
- `visible_hostname kspcb-proxy`:设置代理服务器的主机名为 `kspcb-proxy`。 - `cache_mem 26 MB`:指定 Squid 的缓存内存大小为 26MB。 - `cache_swap_low 90` 和 `cache_swap_high 95`:分别设置了 Squid ...