最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jQuery AJAX回調函數(shù)this指向問題

 更新時間:2010年02月08日 07:19:19   作者:  
了解JavaScript的人都知道JavaScript的this不總是指向當前對象,函數(shù)或類中的this指向與調用這個函數(shù)的對象以及上下文環(huán)境是息息相關的。
如在全局作用域調用一個含this的對象,此時當前對象的this指向的是window。為了讓this的指向符合自己的意愿,JavaScript提供了兩個方法用以改變this的指向,它們是call和apply,當然也有利用閉包來實現(xiàn)的方法。本文通過一個例子來說明這些問題。

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

復制代碼 代碼如下:

//一個沒有實際意義的socket連接對象
var socket =
{
connect: function(host, port)
{
alert('Connecting socket server,host:' + host + ',port:' + port);
}
};
//一個即時通訊類,其中connect方法還將作為AJAX回調函數(shù)被調用
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,那是因為回調函數(shù)的this不是指向IM對象,而是jQuery的AJAX配置對象ajaxSettings。在jQuery內部是用s.success代替?zhèn)魅氲幕卣{函數(shù)去執(zhí)行的,而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);
}
}


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

方法一

直接傳對象的正確引用而非this指針,或叫對象實傳。這是最常見的做法,即在類實例化時用一個變量存儲對當前對象的引用,在后面的方法中直接使用此變量代替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加閉包實現(xiàn)真正改變this的指向。下面方法把函數(shù)調用時的this對象存到一個臨時變量_method,然后又利用閉包把它傳給返回的function對象,在這個返回的function中使用apply把調用時對象的this替換為目標對象thisObj。這種方法是很多JavaScript框架的做法,而且下面這個Function原型方法正是我從prototype框架精簡而來。注意我是先給Function原型加了Apply方法,這個Apply不是腳本內置的apply,是我自定義的,如果你喜歡可以定個別的名字。
復制代碼 代碼如下:

/**
* 改變jQuery AJAX回調函數(shù)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));

方法三

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

$.get('CheckWebLogin.aspx', function(data){IM.connect(data)});

相關文章

  • 支持ie與FireFox的剪切板操作代碼

    支持ie與FireFox的剪切板操作代碼

    支持ie與FireFox的剪切板代碼,包括讀取與寫入剪切板的實現(xiàn)代碼。
    2009-09-09
  • js實現(xiàn)圖片加載淡入淡出效果

    js實現(xiàn)圖片加載淡入淡出效果

    這篇文章主要為大家詳細介紹了js實現(xiàn)圖片加載淡入淡出效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • js彈出層永遠居中實現(xiàn)思路及代碼

    js彈出層永遠居中實現(xiàn)思路及代碼

    彈出層永遠居中的方法有很多,在本文為大家詳細介紹下使用js是如何輕松實現(xiàn)的,喜歡的朋友可以參考下
    2013-11-11
  • JS算法教程之字符串去重與字符串反轉

    JS算法教程之字符串去重與字符串反轉

    這篇文章主要給大家介紹了關于JS算法教程之字符串去重與字符串反轉的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • js print打印網頁指定區(qū)域內容的簡單實例

    js print打印網頁指定區(qū)域內容的簡單實例

    下面小編就為大家?guī)硪黄猨s print打印網頁指定區(qū)域內容的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • JS實現(xiàn)表單中checkbox對勾選中增加邊框顯示效果

    JS實現(xiàn)表單中checkbox對勾選中增加邊框顯示效果

    這篇文章主要介紹了JS實現(xiàn)表單中checkbox對勾選中增加邊框顯示效果,可實現(xiàn)點擊后圖片增加邊框及勾選的功能,非常簡潔實用,需要的朋友可以參考下
    2015-08-08
  • 淺談Javascript中的Function與Object

    淺談Javascript中的Function與Object

    這篇文章主要簡單介紹了Javascript中的Function與Object的關系,并附上示例分析,對于我們更好的理解Javascript中的Function與Object的關系很有幫助,有需要的小伙伴參考下。
    2015-01-01
  • uniapp微信小程序:key失效的解決方法

    uniapp微信小程序:key失效的解決方法

    這篇文章主要介紹了uniapp微信小程序:key失效的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • layer彈窗在鍵盤按回車將反復刷新的實現(xiàn)方法

    layer彈窗在鍵盤按回車將反復刷新的實現(xiàn)方法

    今天小編就為大家分享一篇layer彈窗在鍵盤按回車將反復刷新的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 微信小程序實現(xiàn)彈出菜單

    微信小程序實現(xiàn)彈出菜單

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)彈出菜單功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論

游戏| 阳谷县| 芦溪县| 永年县| 房产| 虞城县| 安化县| 浠水县| 郸城县| 蚌埠市| 尼勒克县| 曲麻莱县| 长武县| 正镶白旗| 儋州市| 东光县| 涟源市| 彝良县| 三明市| 色达县| 介休市| 大余县| 通州区| 福建省| 琼中| 牙克石市| 平度市| 兴安县| 于都县| 林周县| 新密市| 进贤县| 苍南县| 陵水| 梁河县| 印江| 崇明县| 蒙自县| 酉阳| 自治县| 泗洪县|