網站首頁 編程語言 正文
JavaScript中的this不總是指向當前對象,函數或類中的this指向與調用這個函數的對象以及上下文環境是息息相關的。
如在全局作用域調用一個含this的對象,此時當前對象的this指向的是window。
為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當然也有利用閉包來實現的方法。
在Jquery 中的this的指向是怎么樣的呢?
一、Ajax回調函數中的this
默認情況下指向AJAX配置對象ajaxSettings。
在jQuery內部是用s.success代替傳入的回調函數去執行的,而success的調用對象就是s,即ajaxSettings對象的縮寫。
var socket =
{
connect: function(host, port)
{
alert('Connecting socket server,host:' + host + ',port:' + port);
}
};
//一個即時通訊類,其中connect方法還將作為AJAX回調函數被調用
function classIm()
{
this.host = '192.168.1.28';
this.port = '8080';
this.connect = function(data)
{
socket.connect(this.host, this.port);
};
}
var IM = new classIm();
$.get('CheckWebLogin.aspx', IM.connect);
//彈出的host與port都是undefined。
如果希望AJAX回調函數代碼socket.connect(this.host, this.port)中的this指向類classIm的實例對象IM,或者說是想socket.connect()方法能得到正確的參數值,大致有下面幾種方法:
1、設置ajax的context選項
將Ajax回調函數中的this指向對象IM。
$.ajax({
context:IM,
type:'get',
ulr:”page.html”,
success:IM.connect
})
2、調用$.proxy
改變函數內this的指向
$.get(”page.html”,$.proxy(IM.context,IM))
3、對象實傳
直接傳對象的正確引用而非this指針
這是最常見的做法,即在類實例化時用一個變量存儲對當前對象的引用,在后面的方法中直接使用此變量代替this的使用。注意:這種方法并沒有真正改變this的指向。
function classIm()
{
var self = this;
this.host = '192.168.1.28';
this.port = '8080';
this.connect = function(data)
{
socket.connect(self.host, self.port);
};
}
4、使用apply加閉包
實現真正改變this的指向。
這種方法是很多JavaScript框架的做法。
Function.prototype.Proxy = function(thisObj)
{
var _method = this;
return function(data)
{
return _method.apply(thisObj,[data]);
//或者
return function()
{ret _fn.apply(thisObj,arguments);};
};
}
//調用:
var IM = new classIm();
$.get('CheckWebLogin.aspx', IM.connect.Proxy(IM));
5、添加函數包裝器
在匿名回調函數中再調用實際的回調處理函數。不建議使用。
$.get('page.html', function(data){
IM.connect(data)
});
二、jQuery事件綁定回調函數中的this
指向event.currentTarget,即附著這個函數的DOM對象。
1、可以在函數綁定時傳遞參數:
$('#a').bind('click'{self:this},this.onClick);
function onClick(event){
var self=event.data.self;
}
2、可以使用上面的2、3、4、5中方法改變this的指向。
$("#a").click($.proxy(myFun,this));
//或
$("#a").click(myFun.Proxy(this));
原文鏈接:https://www.cnblogs.com/springsnow/p/9461756.html
相關推薦
- 2022-09-05 C語言之實現單鏈表指定結點的插入方式_C 語言
- 2022-09-07 Golang?range?slice?與range?array?之間的區別_Golang
- 2022-05-15 一起來學習Python的元組和列表_python
- 2023-07-22 Spring的編程式事務TransactionTemplate
- 2022-06-09 FreeRTOS軟件定時器apollo中斷狀態判斷_操作系統
- 2022-05-11 Restful的Get請求參數為List
- 2022-10-22 Python基礎Lists和tuple實例詳解_python
- 2022-07-17 C++深入講解namespace與string關鍵字的使用_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支