$.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!
