在某些情況下,我們調用Javascript函數時候,this指針並不一定是我們所期望的那個,例如:
$('#myElement').click(function() {
setTimeout(function() {
// 這個this指向的是settimeout函數內部,而非之前的html元素
$(this).addClass('aNewClass');
}, 1000);
});
這時候怎么辦呢,通常的一種做法是這樣的:
$('#myElement').click(function() {
var that = this; //用that變量把this儲存起來
setTimeout(function() {
$(that).addClass('aNewClass');
}, 1000);
});
但是,在使用了jquery框架的情況下, 有一種更好的方式,就是使用$.proxy函數。
jQuery.proxy(),接受一個函數,然后返回一個新函數,並且這個新函數始終保持了特定的上下文(context )語境。
有兩種語法:
jQuery.proxy( function, context )
/**function:將要改變上下文語境的函數。
** context:函數的上下文語境(`this`)會被設置成這個 object 對象。
**/
jQuery.proxy( context, name )
/**context:函數的上下文語境會被設置成這個 object 對象。
**name:將要改變上下文語境的函數名(這個函數必須是前一個參數 ‘context’ 對象的屬性)
**/
上面的例子使用這種方式就可以修改成:
$('#myElement').click(function() {
setTimeout($.proxy(function() {
$(this).addClass('aNewClass');
}, this), 1000);
});