沒有眼淚
          Don't Cry!
          posts - 13,comments - 44,trackbacks - 0
          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

              項目中經常使用createDelegate()方法來創(chuàng)建代理函數(shù),從而改變當前函數(shù)中this的作用域.看下了源碼,發(fā)現(xiàn)是通過js中的apply()方法來實現(xiàn),想想也只能通過apply()或者call()方法來實現(xiàn),因為js中只有這2個方法提供了改變當前函數(shù)內部this作用域的功能.此外,Ext中很多地方用到了call()和apply()方法,要想看懂源碼,則必須先搞清這2個方法的用法.
              createDelegate方法聲明為:
           1createDelegate : function(obj, args, appendArgs){
           2        var method = this;
           3        return function() {
           4            var callArgs = args || arguments;
           5            if(appendArgs === true){
           6                callArgs = Array.prototype.slice.call(arguments, 0);
           7                callArgs = callArgs.concat(args);
           8            }
          else if(typeof appendArgs == "number"){
           9                callArgs = Array.prototype.slice.call(arguments, 0); // copy arguments first
          10                var applyArgs = [appendArgs, 0].concat(args); // create method call params
          11                Array.prototype.splice.apply(callArgs, applyArgs); // splice them in
          12            }

          13            return method.apply(obj || window, callArgs);
          14        }
          ;
          15    }
          ,
          其中obj表示函數(shù)內部this作用域的范圍,args是數(shù)組,appendArgs是"Boolean或Number",如果appendArgs是Boolean型的且值為true,那么args參數(shù)將跟在調用代理方法時傳入的參數(shù)后面組成數(shù)組一起傳入當前方法,否則只傳入args,如果appendArgs為Number型,那么args將插入到appendArgs指定的位置.
          注意點:
          1.函數(shù)內部的arguments關鍵字是函數(shù)執(zhí)行時動態(tài)創(chuàng)建的,用來存儲調用函數(shù)時所傳入參數(shù).這里第4行的arguments   并不指調用createDelegate方法所傳入的參數(shù)(obj,args,appendArgs),而是指調用return function()時所傳入的參數(shù),即調用代理函數(shù)時所傳入的參數(shù).而args和appendArgs就是調用createDelegate方法時所傳入的參數(shù).總的來說,函數(shù)是在定義它的作用域中執(zhí)行,而不是在調用它的作用域中執(zhí)行.但也有特殊,比如這里的arguments.
          2.call和apply的區(qū)別.
          二者的第一個參數(shù)都是函數(shù)內部this的作用域,call的參數(shù)只能作為一串參數(shù)傳入,而apply可以傳入數(shù)組或arguments對象.如
          fun.call(window,args0,args1,.....);
          fun.apply(window,[1,2,3]);
          但要注意的是apply方法傳遞到函數(shù)內部的參數(shù)實際也是作為一個個參數(shù)傳遞的.如果在fun內部測試arguments.length的話,則長度為3.同樣,我們可以采用arguments[0],arguments[1],arguments[2]來分別引用1,2,3三個參數(shù),而不是用arguments[0][0],arguments[0][1],arguments[0][2]來引用3個參數(shù).這樣才能解釋11行的代碼.
          posted on 2008-04-30 17:11 zhangchao 閱讀(2677) 評論(0)  編輯  收藏 所屬分類: Ext

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 邯郸市| 南通市| 子长县| 松阳县| 青岛市| 息烽县| 东丰县| 贵阳市| 平泉县| 辽阳县| 阿拉尔市| 长治市| 县级市| 体育| 漠河县| 台州市| 望奎县| 比如县| 自贡市| 余干县| 博湖县| 柘城县| 类乌齐县| 张家口市| 富川| 吉木萨尔县| 汤原县| 称多县| 兴安县| 井陉县| 名山县| 扎鲁特旗| 光泽县| 怀宁县| 绥阳县| 格尔木市| 肥城市| 永昌县| 扬州市| 池州市| 原阳县|