<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0
    				
    初次接觸ajax,看到的是一個很簡單的例子:
    ?
    //針對各種瀏覽器建立一個http request的對象
    function getHttpRequest(){
    ??http_request = null;
    ??if (window.XMLHttpRequest) {?
    ?????http_request = new XMLHttpRequest();
    ??} else if (window.ActiveXObject) {
    ??????http_request = new ActiveXObject("Microsoft.XMLHTTP");
    ??}
    ??return http_request;
    }
    var ajax_request;
    functiong getPerson(){
    ? ajax_request = getHttpRequest();??? //建立一個http request
    ? ajax_request.onstatechange = handleResponse;? //指定回調函數
    ? ajax_request.open("GET", "
    ? ajax_request.send();
    }
    ?
    function handleResponse(){
    ? if(ajax_request.readyState != 4) return;
    ? if(ajax_request.status == 200){
    ??? var xml = ajax_request.responseXML;
    ??? /*?對獲得的xml的處理 */
    ? }
    }
    ?
    調用的時候可以直接在頁面里調用
    getPerson();
    ?
    這個函數會建立一個httpRequest對象,然后發送請求,在請求返回的時候會自動調用handleResponse函數來完成操作。
    在簡單的環境上,上述代碼會工作得很好,但是如果在一個頁面中要執行多次這種操作就比較麻煩了,需要寫多個函數,看一下上面的定義:
    var ajax_request; 表示這是個全局變量,多次請求的時候每個請求都要用到這個對象,ajax又是異步的,無法事先確定哪個請求先返回。
    ?
    如果把ajax_request作為函數內的局部變量呢?那樣如果在handleResponse里能看到ajax_request對象就可以解決這個問題了。
    可以考慮把ajax_request作為一個參數傳遞給handleResponse,現在的問題是,對handleResponse的調用是自動的,怎么能在參數列表中添加這個參數呢?我們想到了this變量,在javascript中,所有的東西都是對象,this表示當前對象,在函數中this就表示當前的函數。
    javascript提供了一種可以改變this的方法——apply()。
    javascript對apply的解釋是:使用指定對象替換當前對象并調用函數。比如:
    ?
    function test_apply(){
    ? alert(this);
    }
    test_apply.apply(document, []);
    ?
    就表示調用函數test_apply,并用document對象來替換test_apply中的this。
    ?
    回到剛剛的問題,為了修改當前對象,需要在指定handleResponse的時候就修改this對象。ajax_request.onstatechange是一個函數的句柄,只要我把一個函數的句柄賦值給它就可以了,同時函數也是一種對象,Function對象,因此我們為函數對象添加一個方法:
    Function.prototype.setThis(){
    ? var curr_function = this;
    ? var to_this_object = arguments[0];
    ? return function(){
    ??? currFunc.apply(to_this_object, []);
    ? };
    }
    ?
    下面,修改getPerson為:
    functiong getPerson(){
    ? var tmp_request = getHttpRequest();??? //建立一個http request
    ? tmp_request.onstatechange = handleResponse.setThis(tmp_request);? //指定回調函數
    ?
    修改handleResponse為:
    function handleResponse(){
    ? if(this.readyState != 4) return;
    ? if(this.status == 200){
    ??? var xml = this.responseXML;
    ??? /*?對獲得的xml的處理 */
    ? }
    }
    即可。
    具體的變化就在于tmp_request.onstatechange = handleResponse.setThis(tmp_request);?
    因為handleResponse是一個函數,因此它具有Function新添加的方法setThis,
    下面來看setThis方法:
    var curr_function = this;? //獲得當前的函數本身
    var to_this_object = arguments[0];? //獲得要指定的新的this對象
    return function(){
    ??? currFunc.apply(to_this_object, []);
    ? };
    ?
    這里的返回值是一個函數,即當tmp_request的onstatechange事件的時候會觸發這個函數,該函數中只有一句
    currFunc.apply(to_this_object, []);即用to_this_object替換當前對象并調用currFunc,在這里currFunc即代表了handleResponse,因此調用handleResponse,因為已經修改了其this對象,因此在handleResponse中用this即代表了tmp_request對象。
    用這種方法可以減化代碼,并使代碼更具可重用性。


















    FeedBack:
    # re: javascript apply方法
    2013-11-11 16:43 | 淘小強
    這里有個用javascript的call實現的foreach,nnd有點復雜,看不懂!還用到原型鏈啥的。http://jsfiddle.net/kixi/3gKAa/2/  回復  更多評論
      
    主站蜘蛛池模板: 成在线人永久免费视频播放| 精品无码国产污污污免费网站国产| 亚洲视频在线不卡| 亚洲AV无码乱码国产麻豆| 亚洲最大激情中文字幕| 亚洲精品制服丝袜四区| 亚洲午夜久久久影院伊人| 亚洲无人区午夜福利码高清完整版| 亚洲人成中文字幕在线观看| 亚洲va无码手机在线电影| 精品国产_亚洲人成在线高清| 西西人体44rt高清亚洲 | 免费国产午夜高清在线视频| 国产免费一区二区视频| 久久久久久一品道精品免费看| 三年片在线观看免费观看大全动漫| 午夜精品免费在线观看| 亚洲免费视频观看| 毛片a级毛片免费观看品善网| 日韩激情无码免费毛片| 免费国产真实迷j在线观看| 亚洲一区二区三区无码影院| 亚洲熟妇av一区二区三区漫画| 亚洲国产精品高清久久久| 亚洲精品福利网泷泽萝拉| 亚洲熟妇成人精品一区| 深夜a级毛片免费无码| 国产又黄又爽又大的免费视频| 久久青青草原国产精品免费| 永久黄色免费网站| 午夜dj免费在线观看| 亚洲人成人网站在线观看| 久久久久亚洲精品美女| 亚洲午夜电影在线观看| 苍井空亚洲精品AA片在线播放 | 亚洲AV成人无码天堂| 亚洲av片在线观看| 你懂的网址免费国产| 久久福利资源网站免费看| 国产成人免费高清在线观看| 久久亚洲高清综合|