$.proxy() 最主要就是用来修改函数执行时的上下文对象的。

先看以下情景:

<div id="panel" style="display:none;">
<button class="close">消失</button>
</div>
<script>
$("#panel").fadeIn(function () {
  $('.close').click(function () {
    $(this).fadeOut(); // 其实这里我想让 #panel 隐藏来着
  });
});
$('#panel').click(function() {
  setTimeout(function() {
    $(this).addClass('aNewClass'); // 这个 this 根本就不对嘛
  }, 1000);
});
</script>

打断一下...这里用 var $this = $(this); 来处理也可以呀。

妈蛋,还让不让我讲了啊喂。骚年郎,你是还没接触到 this 这门艺术的高深之处才会这样觉得,将 this 不去标量化才是我们装逼的价值。

不但少了个生成变量的性能输出,还避免了变量名耦合,最极致的莫过于提高了复用性...

看一眼改版后的代码

$("#panel").fadeIn(function(){
$('.close').click($.proxy(HidePanel, this));
// 相比这个 $('.close').click(function(){HidePanel()}); 优美很多
});
function HidePanel() {
$(this).fadeOut();
}
$('#panel').click(function() {
  setTimeout($.proxy(function() {
    $(this).addClass('aNewClass');
  }, this), 1000);
});

  

上文说的是 $.proxy(fn, context) 用法,

而 $.proxy(context, name) 用法感觉更多的用在对象上,个人用的较少,因为感觉 new 一个对象函数要更爽(而 new 出来的 this 肯定不会乱了呀),不过还是列一下吧

var person = {
  name: "zyh",
  say: function(event) {alert(this.name)},
}
// $('#test').click(person.say) 显然有问题
$('.test').click($.proxy(person,'say'));

喊口号:热爱前端,活用 this!

随机推荐

  1. Photoshop脚本之储存图片

    function saveEPS( doc, saveFile ) { var saveOptions = new EPSSaveOptions( ); saveOptions.encoding = ...

  2. 如何给Eclipse添加一个JDK或JRE

    第一:  第二:  第三:  第四: 

  3. 模式识别之概率分布---平均分布,正态分布,一阶滑动和,一阶线性回归 C语言编程

    http://wenku.baidu.com/view/11cb1669a98271fe910ef9c6.html

  4. 关于dll的pdb文件的小贴士

    .pdb文件最好与生成它的.dll文件放在一起,这样调试的时候才有可能跟踪进dll的内部函数里.

  5. go语言调用cmd

    package main import ( "fmt" "os/exec" ) func main() { //删除C:\Users\Administrator ...

  6. 服务器之ECC报错检查

    需要使用ipmitool工具 [root@Resource ~]# yum install ipmitool 首先查看是否有ecc报错 如下图: [root@Resource ~]# ipmitool ...

  7. [Spring MVC]学习笔记--FreeMarker的使用

    还是先贴出该例子存于github上的位置 https://github.com/lemonbar/spring-mvc-freemarker Sping-Framework 的官方文档简单列出了在sp ...

  8. centos6.9下php7安装zip扩展

    cd /usr/local/src wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zxvf zip-1.13.5.tgz cd zip-1.13.5 ...

  9. PCL+Qt+VS可视化点云

    前言 Point Cloud Library (PCL)是一个功能强大的开源C++库,假设可以使用好PCL将会对我们在LiDAR数据处理领域的研究产生巨大帮助.LiDAR技术经过几十年的发展.眼下国内 ...

  10. Spring 单例

    我们知道 Web 容器本身就是多线程的,Web 容器为一个 Http 请求创建一个独立的线程,所以由此请求所牵涉到的 Spring 容器中的 Bean 也是运行于多线程的环境下.在绝大多数情况下,Sp ...