国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 20:47:13
文檔

jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧

jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧:如在全局作用域調(diào)用一個含this的對象,此時當(dāng)前對象的this指向的是window。為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當(dāng)然也有利用閉包來實(shí)現(xiàn)的方法。本文通過一個例子來說明這些問題。 先看一段演
推薦度:
導(dǎo)讀jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧:如在全局作用域調(diào)用一個含this的對象,此時當(dāng)前對象的this指向的是window。為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當(dāng)然也有利用閉包來實(shí)現(xiàn)的方法。本文通過一個例子來說明這些問題。 先看一段演

如在全局作用域調(diào)用一個含this的對象,此時當(dāng)前對象的this指向的是window。為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當(dāng)然也有利用閉包來實(shí)現(xiàn)的方法。本文通過一個例子來說明這些問題。

先看一段演示代碼,這代碼只供演示用,沒有實(shí)際意義。

代碼如下:
//一個沒有實(shí)際意義的socket連接對象
var socket =
{
connect: function(host, port)
{
alert('Connecting socket server,host:' + host + ',port:' + port);
}
};
//一個即時通訊類,其中connect方法還將作為AJAX回調(diào)函數(shù)被調(diào)用
function classIm()
{
this.host = '192.168.1.28';
this.port = '8080';
this.connect = function(data)
{
socket.connect(this.host, this.port);
};
}
//實(shí)例化即時通訊類
var IM = new classIm();
//AJAX請求,這里假設(shè)要打開socket連接首先要通過WEB得知用戶WEB登錄成功
$.get('CheckWebLogin.aspx', IM.connect);
運(yùn)行上面的例子,你將看到彈出的host與port都是undefined,那是因?yàn)榛卣{(diào)函數(shù)的this不是指向IM對象,而是jQuery的AJAX配置對象ajaxSettings。在jQuery內(nèi)部是用s.success代替?zhèn)魅氲幕卣{(diào)函數(shù)去執(zhí)行的,而success的調(diào)用對象就是s,即下面ajaxSettings對象的縮寫。

ajaxSettings:
{
url: location.href,
global: true,
type: "GET",
contentType: "application/x-www-form-urlencoded",
processData: true,
async: true
}

為了證明這一點(diǎn),你可以這樣修改代碼測試一下,你將看到是url、global、type、contentType等對象的屬性名稱:
代碼如下:
this.connect = function(data)
{
for (var key in this)
{
alert(key);
}
}

現(xiàn)在了解了問題所在,接下來想辦法解決這個問題。其實(shí)我們的目的是希望AJAX回調(diào)函數(shù)代碼socket.connect(this.host, this.port)中的this指向類classIm的實(shí)例對象IM,或者說是想socket.connect()方法能得到正確的參數(shù)值吧。為了得到預(yù)期的AJAX回調(diào)函數(shù)執(zhí)行結(jié)果,我分析了大致有下面幾種方法:

方法一

直接傳對象的正確引用而非this指針,或叫對象實(shí)傳。這是最常見的做法,即在類實(shí)例化時用一個變量存儲對當(dāng)前對象的引用,在后面的方法中直接使用此變量代替this的使用。注意:這種方法并沒有真正改變this的指向。演示代碼如下,注意對比前后兩次代碼的區(qū)別,我也特別高亮顯示差異部分代碼。
代碼如下:
var socket =
{
connect: function(host, port)
{
alert('Connecting socket server,host:' + host + ',port:' + port);
}
};
function classIm()
{
var self = this;
this.host = '192.168.1.28';
this.port = '8080';
this.connect = function(data)
{
socket.connect(self.host, self.port);
};
}
var IM = new classIm();
$.get('CheckWebLogin.aspx', IM.connect);

方法二

使用apply加閉包實(shí)現(xiàn)真正改變this的指向。下面方法把函數(shù)調(diào)用時的this對象存到一個臨時變量_method,然后又利用閉包把它傳給返回的function對象,在這個返回的function中使用apply把調(diào)用時對象的this替換為目標(biāo)對象thisObj。這種方法是很多JavaScript框架的做法,而且下面這個Function原型方法正是我從prototype框架精簡而來。注意我是先給Function原型加了Apply方法,這個Apply不是腳本內(nèi)置的apply,是我自定義的,如果你喜歡可以定個別的名字。
代碼如下:
/**
* 改變jQuery AJAX回調(diào)函數(shù)this指針指向
* @param {Object} thisObj 要替換當(dāng)前this指針的對象
* @return {Function} function(data){}
*/
Function.prototype.Apply = function(thisObj)
{
var _method = this;
return function(data)
{
return _method.apply(thisObj,[data]);
};
}
var socket =
{
connect: function(host, port)
{
alert('Connecting socket server,host:' + host + ',port:' + port);
}
};
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.Apply(IM));

方法三

在匿名回調(diào)函數(shù)中再調(diào)用實(shí)際的回調(diào)處理函數(shù)。這種方法雖然可以解決同樣的問題的,但是代碼有點(diǎn)長和多余,實(shí)際開發(fā)中是不建議這樣做的。這種方法是保證了調(diào)用connect方法的對象還是IM對象,從而保證了this指向還是IM對象。代碼如下:
代碼如下:
$.get('CheckWebLogin.aspx', function(data){IM.connect(data)});

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧

jQueryAJAX回調(diào)函數(shù)this指向問題_javascript技巧:如在全局作用域調(diào)用一個含this的對象,此時當(dāng)前對象的this指向的是window。為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當(dāng)然也有利用閉包來實(shí)現(xiàn)的方法。本文通過一個例子來說明這些問題。 先看一段演
推薦度:
標(biāo)簽: 問題 javascript 指向
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 日韩免费一区 | 免费a一毛片 | 亚洲国产精品欧美日韩一区二区 | 久久免费福利视频 | 国产毛片在线 | 久久99精品久久久久久青青91 | 国产成人精品曰本亚洲 | 国产精品亚洲国产三区 | 日韩精品一区在线观看 | 一区二区三区高清不卡 | 欧美国产精品va在线观看 | 日韩视频高清 | 久久免费精品国产72精品剧情 | 美女网站全黄 | 日韩欧美在线看 | 性欧美嫩交hd | 日本免费一二三区 | 日本欧美一区二区三区 | 日本免费大黄 | 国产成人综合久久精品亚洲 | 精品久久一区二区 | 国产精品毛片在线直播完整版 | 8x成人在线 | 欧美精品一区二区在线观看播放 | 最新国产网站 | 成人特黄午夜性a一级毛片 成人国产一区二区三区精品 | 日韩影片在线观看 | 国产成人精品三级在线 | 一级黄毛片 | 国产免费全部免费观看 | 五月天婷婷视频在线观看 | 足交在线观看 | 精品国产一区二区三区19 | 久久香蕉国产线看观看乱码 | 成人午夜精品久久久久久久小说 | 国产91久久精品一区二区 | 91麻豆精品国产91久久久久久 | 欧美网站在线看 | 亚洲欧美成人综合久久久 | 亚洲欧美日韩国产色另类 | 亚洲日韩在线观看 |