<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        jQueryAJAX回調函數this指向問題_javascript技巧

        來源:懂視網 責編:小采 時間:2020-11-27 20:47:13
        文檔

        jQueryAJAX回調函數this指向問題_javascript技巧

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

        如在全局作用域調用一個含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)});

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

        文檔

        jQueryAJAX回調函數this指向問題_javascript技巧

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 真正全免费视频a毛片| 国产精品亚洲一区二区麻豆| 免费一级全黄少妇性色生活片 | 亚洲国产精品一区二区第四页| 亚洲中文字幕AV每天更新| 欧美在线看片A免费观看| 在线综合亚洲中文精品| 成年女人18级毛片毛片免费| 亚洲婷婷第一狠人综合精品| 日韩在线天堂免费观看| 一本天堂ⅴ无码亚洲道久久| 思思99re66在线精品免费观看| 国产精品亚洲lv粉色| 亚洲成av人在片观看| 国产午夜精品免费一区二区三区| 亚洲av中文无码乱人伦在线咪咕| 777成影片免费观看| 亚洲人成7777| 全部免费a级毛片| 中文精品人人永久免费| 亚洲AV一宅男色影视| 99在线精品免费视频九九视| 在线观看日本亚洲一区| 国产日产亚洲系列最新| 先锋影音资源片午夜在线观看视频免费播放 | 亚洲国产午夜精品理论片| 毛片免费vip会员在线看| 瑟瑟网站免费网站入口| 亚洲AV日韩AV永久无码绿巨人 | 3d动漫精品啪啪一区二区免费| 亚洲一级黄色大片| 免费在线看片网站| 久久国产乱子免费精品| 一区二区亚洲精品精华液| 亚洲伦乱亚洲h视频| 毛片无码免费无码播放| 成人永久免费福利视频网站| 免费在线观影网站| 亚洲精品第一国产综合亚AV| 亚洲精品成人无限看| 免费无码又爽又刺激聊天APP|