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;? //指定回調(diào)函數(shù)
          ? 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的處理 */
          ? }
          }
          ?
          調(diào)用的時候可以直接在頁面里調(diào)用
          getPerson();
          ?
          這個函數(shù)會建立一個httpRequest對象,然后發(fā)送請求,在請求返回的時候會自動調(diào)用handleResponse函數(shù)來完成操作。
          在簡單的環(huán)境上,上述代碼會工作得很好,但是如果在一個頁面中要執(zhí)行多次這種操作就比較麻煩了,需要寫多個函數(shù),看一下上面的定義:
          var ajax_request; 表示這是個全局變量,多次請求的時候每個請求都要用到這個對象,ajax又是異步的,無法事先確定哪個請求先返回。
          ?
          如果把ajax_request作為函數(shù)內(nèi)的局部變量呢?那樣如果在handleResponse里能看到ajax_request對象就可以解決這個問題了。
          可以考慮把ajax_request作為一個參數(shù)傳遞給handleResponse,現(xiàn)在的問題是,對handleResponse的調(diào)用是自動的,怎么能在參數(shù)列表中添加這個參數(shù)呢?我們想到了this變量,在javascript中,所有的東西都是對象,this表示當(dāng)前對象,在函數(shù)中this就表示當(dāng)前的函數(shù)。
          javascript提供了一種可以改變this的方法——apply()。
          javascript對apply的解釋是:使用指定對象替換當(dāng)前對象并調(diào)用函數(shù)。比如:
          ?
          function test_apply(){
          ? alert(this);
          }
          test_apply.apply(document, []);
          ?
          就表示調(diào)用函數(shù)test_apply,并用document對象來替換test_apply中的this。
          ?
          回到剛剛的問題,為了修改當(dāng)前對象,需要在指定handleResponse的時候就修改this對象。ajax_request.onstatechange是一個函數(shù)的句柄,只要我把一個函數(shù)的句柄賦值給它就可以了,同時函數(shù)也是一種對象,F(xiàn)unction對象,因此我們?yōu)楹瘮?shù)對象添加一個方法:
          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);? //指定回調(diào)函數(shù)
          ?
          修改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是一個函數(shù),因此它具有Function新添加的方法setThis,
          下面來看setThis方法:
          var curr_function = this;? //獲得當(dāng)前的函數(shù)本身
          var to_this_object = arguments[0];? //獲得要指定的新的this對象
          return function(){
          ??? currFunc.apply(to_this_object, []);
          ? };
          ?
          這里的返回值是一個函數(shù),即當(dāng)tmp_request的onstatechange事件的時候會觸發(fā)這個函數(shù),該函數(shù)中只有一句
          currFunc.apply(to_this_object, []);即用to_this_object替換當(dāng)前對象并調(diào)用currFunc,在這里currFunc即代表了handleResponse,因此調(diào)用handleResponse,因為已經(jīng)修改了其this對象,因此在handleResponse中用this即代表了tmp_request對象。
          用這種方法可以減化代碼,并使代碼更具可重用性。


















          FeedBack:
          # re: javascript apply方法
          2013-11-11 16:43 | 淘小強
          這里有個用javascript的call實現(xiàn)的foreach,nnd有點復(fù)雜,看不懂!還用到原型鏈啥的。http://jsfiddle.net/kixi/3gKAa/2/  回復(fù)  更多評論
            
          主站蜘蛛池模板: 仙居县| 邹城市| 江北区| 自贡市| 威信县| 寿光市| 博乐市| 许昌县| 普兰店市| 马公市| 炎陵县| 阳高县| 汶川县| 微博| 浦城县| 房产| 乌拉特后旗| 上杭县| 仁怀市| 吴旗县| 无极县| 屏边| 桑日县| 巧家县| 宝兴县| 武城县| 横峰县| 包头市| 唐海县| 贵州省| 淅川县| 中超| 定安县| 晋江市| 澎湖县| 南溪县| 曲周县| 永泰县| 华宁县| 闻喜县| 石门县|