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

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

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

    javascript apply()方法

    Posted on 2007-05-18 03:24 sunbaby 閱讀(475) 評論(0)  編輯  收藏 所屬分類: 其它
    http://hi.baidu.com/zys0202/blog/item/fec7945294de330e0df3e349.html

    javascript apply()方法通過一個例子說明apply()的用法://針對各種瀏覽器建立一個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", "
    http://myhost.com/sample.xml", null);  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);  //指定回調函數  tmp_request.open("GET", "http://myhost.com/sample.xml", null);  tmp_request.send();} 修改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對象。用這種方法可以減化代碼,并使代碼更具可重用性。源文地址:http://www.cublog.cn/opera/showart.php?blogid=21787&id=140549附注:應用某一對象的一個方法,用另一個對象替換當前對象。apply([thisObj[,argArray]])參數thisObj可選項。將被用作當前對象的對象。argArray可選項。將被傳遞給該函數的參數數組。說明如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。如果沒有提供 argArray 和 thisObj 任何一個參數,那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數。
     
     

    posts - 2, comments - 2, trackbacks - 0, articles - 25

    Copyright © sunbaby

    free web counter
    free web counter 點擊發送消息給我
    主站蜘蛛池模板: 亚洲精品国产福利在线观看| 亚洲M码 欧洲S码SSS222| 国产精品亚洲综合网站| 久久久亚洲欧洲日产国码农村| 欧美男同gv免费网站观看| a级日本高清免费看| 精品国产亚洲一区二区三区在线观看 | 国产免费网站看v片在线| 亚洲乱色伦图片区小说| 亚洲一区二区三区首页| 亚洲免费人成在线视频观看| 成人毛片免费观看| 大地资源免费更新在线播放| 国产精品偷伦视频观看免费| 一级毛片a免费播放王色电影 | 亚洲妓女综合网99| 国产精品亚洲精品日韩已满| 国产zzjjzzjj视频全免费| 成年在线观看免费人视频草莓| 久久受www免费人成_看片中文| 一级毛片免费观看| 5g影院5g天天爽永久免费影院 | 亚洲AV无码第一区二区三区| 国产精品免费看香蕉| 亚洲精品网站在线观看你懂的| 国国内清清草原免费视频99| 激情综合亚洲色婷婷五月| 亚洲国产激情一区二区三区| 亚洲第一成年免费网站| 精品视频在线免费观看| 51视频精品全部免费最新| 最近中文字幕无吗高清免费视频| 一个人看www在线高清免费看| 色播精品免费小视频| 免费v片在线观看品善网| 337p日本欧洲亚洲大胆裸体艺术 | 亚洲电影中文字幕| 亚洲欧洲精品成人久久曰| 91av免费在线视频| 亚州免费一级毛片| 亚洲无码日韩精品第一页|