天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

jQuery AJAX回調函數this指向問題

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

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

復制代碼 代碼如下:
//一個沒有實際意義的socket連接對象
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();
//AJAX請求,這里假設要打開socket連接首先要通過WEB得知用戶WEB登錄成功
$.get('CheckWebLogin.ASPx', IM.connect);
運行上面的例子,你將看到彈出的host與port都是undefined,那是因為回調函數的this不是指向IM對象,而是jQuery的AJAX配置對象ajaxSettings。在jQuery內部是用s.success代替傳入的回調函數去執行的,而success的調用對象就是s,即下面ajaxSettings對象的縮寫。

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

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


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

方法一

直接傳對象的正確引用而非this指針,或叫對象實傳。這是最常見的做法,即在類實例化時用一個變量存儲對當前對象的引用,在后面的方法中直接使用此變量代替this的使用。注意:這種方法并沒有真正改變this的指向。演示代碼如下,注意對比前后兩次代碼的區別,我也特別高亮顯示差異部分代碼。
復制代碼 代碼如下:
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加閉包實現真正改變this的指向。下面方法把函數調用時的this對象存到一個臨時變量_method,然后又利用閉包把它傳給返回的function對象,在這個返回的function中使用apply把調用時對象的this替換為目標對象thisObj。這種方法是很多JavaScript框架的做法,而且下面這個Function原型方法正是我從prototype框架精簡而來。注意我是先給Function原型加了Apply方法,這個Apply不是腳本內置的apply,是我自定義的,如果你喜歡可以定個別的名字。
復制代碼 代碼如下:
/**
* 改變jQuery AJAX回調函數this指針指向
* @param {Object} thisObj 要替換當前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));

方法三

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

JavaScript技術jQuery AJAX回調函數this指向問題,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚欧视频在线观看 | xxnxx美女| 97资源站超碰在线视频 | 日韩亚洲国产欧美免费观看 | 色宅男午夜电影网站 | 亚洲无吗视频 | yellow片高清视频免费看 | 中文字幕 日韩 无码 在线 | 97人人超碰国产精品最新蜜芽 | 最新国产成人综合在线观看 | 久久精品国产eeuss | 俺也去最新地址 | yellow片在线观看免费观看动漫 | 日韩精品在线看 | 亚洲AV无码乱码A片无码蜜桃 | 在线日韩欧美一区二区三区 | 处 女 开 破小说 | 肉动漫无码无删减在线观看 | www色视频在线观看 WWW色视频片内射 | 欧美日韩在线亚洲一 | 40岁东北老阿姨无码 | 国产AV亚洲精品久久久久软件 | 最近日本免费观看MV免费 | 久久久精品免费视频 | 国产精品亚洲精品久久国语 | 日本亚欧热亚洲乱色视频 | 男人边吃奶边摸边做刺激情话 | 亚洲女人网 | 暖暖 日本 视频 在线观看免费 | 毛片免费播放 | 欧美牲交A欧美牲交VDO | 女子初尝黑人巨嗷嗷叫 | 99精品国产免费久久久久久下载 | 99久久国产宗和精品1上映 | 欧洲人交xxx69 | 日日夜夜狠狠干 | 51精品国产AV无码久久久密桃 | 亚洲高清在线视频 | 暖暖直播免费观看韩国 | 亚洲国产欧美另类 | 国产AV精品白浆一区二 |