在某些狀況下,咱們調用Javascript函數時候,this指針並不必定是咱們所指望的那個。例如:html
1 //正常的this使用 2 $('#myElement').click(function() { 3 4 // 這個this是咱們所指望的,當前元素的this. 5 6 $(this).addClass('aNewClass'); 7 8 }); 9 10 11 //並不是所指望的this 12 $('#myElement').click(function() { 13 14 setTimeout(function() { 15 16 // 這個this指向的是settimeout函數內部,而非以前的html元素 17 18 $(this).addClass('aNewClass'); 19 20 }, 1000); 21 22 });
這時候怎麼辦呢,一般的一種作法是這樣的:jquery
1 $('#myElement').click(function() { 2 var that = this; //設置一個變量,指向這個須要的this 3 4 setTimeout(function() { 5 6 // 這個this指向的是settimeout函數內部,而非以前的html元素 7 8 $(that).addClass('aNewClass'); 9 10 }, 1000); 11 12 });
可是,在使用了jquery框架的狀況下, 有一種更好的方式,就是使用$.proxy函數。框架
jQuery.proxy(),接受一個函數,而後返回一個新函數,而且這個新函數始終保持了特定的上下文(context )語境。函數
有兩種語法:this
jQuery.proxy( function, context ) /**function將要改變上下文語境的函數。 ** context函數的上下文語境(`this`)會被設置成這個 object 對象。 **/ jQuery.proxy( context, name ) /**context函數的上下文語境會被設置成這個 object 對象。 **name將要改變上下文語境的函數名(這個函數必須是前一個參數 ‘context’ **對象的屬性) **/
上面的例子使用這種方式就能夠修改爲:spa
$('#myElement').click(function() { setTimeout($.proxy(function() { $(this).addClass('aNewClass'); }, this), 1000); });