<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      前端開(kāi)發(fā)者進(jìn)階之惰性函數(shù)定義

      穆乙:http://www.rzrgm.cn/pigtail/p/3447660.html 

      函數(shù)是js世界的一等公民,js的動(dòng)態(tài)性、易變性在函數(shù)的應(yīng)用上,體現(xiàn)的淋漓盡致。做為參數(shù),做為返回值等,正是函數(shù)這些特性,使得js開(kāi)發(fā)變的有趣。

      下面就闡述一下,js一個(gè)有趣的應(yīng)用--惰性函數(shù)定義(Lazy Function Definition)。

      惰性載入表示函數(shù)執(zhí)行的分支只會(huì)在函數(shù)第一次掉用的時(shí)候執(zhí)行,在第一次調(diào)用過(guò)程中,該函數(shù)會(huì)被覆蓋為另一個(gè)按照合適方式執(zhí)行的函數(shù),這樣任何對(duì)原函數(shù)的調(diào)用就不用再經(jīng)過(guò)執(zhí)行的分支了。

      下面我們看幾個(gè)典型的例子:

      function addEvent (type, element, fun) {
          if (element.addEventListener) {
              element.addEventListener(type, fun, false);
          }
          else if(element.attachEvent){
              element.attachEvent('on' + type, fun);
          }
          else{
              element['on' + type] = fun;
          }
      }

      上面是注冊(cè)函數(shù)監(jiān)聽(tīng)的各瀏覽器兼容函數(shù)。由于,各瀏覽之間的差異,不得不在用的時(shí)候做能力檢測(cè)。顯然,單從功能上講,已經(jīng)做到了兼容瀏覽器。美中不足,每次綁定監(jiān)聽(tīng),都會(huì)對(duì)能力做一次檢測(cè)。然而,真正的應(yīng)用中,這顯然是多余的,同一個(gè)應(yīng)用環(huán)境中,其實(shí)只需要檢測(cè)一次即可。

      下面我們重寫(xiě)上面的addEvent:

      function addEvent (type, element, fun) {
          if (element.addEventListener) {
              addEvent = function (type, element, fun) {
                  element.addEventListener(type, fun, false);
              }
          }
          else if(element.attachEvent){
              addEvent = function (type, element, fun) {
                  element.attachEvent('on' + type, fun);
              }
          }
          else{
              addEvent = function (type, element, fun) {
                  element['on' + type] = fun;
              }
          }
          return addEvent(type, element, fun);
      }

      由上,第一次調(diào)用addEvent會(huì)對(duì)瀏覽器做能力檢測(cè),然后,重寫(xiě)了addEvent。下次再調(diào)用的時(shí)候,由于函數(shù)被重寫(xiě),不會(huì)再做能力檢測(cè)。

      同樣的應(yīng)用,javascript高級(jí)程序設(shè)計(jì)里的一例子:

      function createXHR(){
          if (typeof XMLHttpRequest != "undefined"){
              return new XMLHttpRequest();
          } else if (typeof ActiveXObject != "undefined"){
              if (typeof arguments.callee.activeXString != "string"){
                  var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
                                  "MSXML2.XMLHttp"];
          
                  for (var i=0,len=versions.length; i < len; i++){
                      try {
                          var xhr = new ActiveXObject(versions[i]);
                          arguments.callee.activeXString = versions[i];
                          return xhr;
                      } catch (ex){
                          //skip
                      }
                  }
              }
          
              return new ActiveXObject(arguments.callee.activeXString);
          } else {
              throw new Error("No XHR object available.");
          }
      }

      很顯然,惰性函數(shù)在這里優(yōu)勢(shì)更加明顯,因?yàn)檫@里有更多的分支。下面我們看一下重寫(xiě)后臺(tái)的函數(shù):

      function createXHR() {
                  if (typeof XMLHttpRequest != "undefined") {
                      createXHR = function () {
                          return new XMLHttpRequest();
                      }
                      return new XMLHttpRequest();
                  } else if (typeof ActiveXObject != "undefined") {
                      var curxhr;
                      var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0",
                          "MSXML2.XMLHttp"];
      
                      for (var i = 0, len = versions.length; i < len; i++) {
                          try {
                              var xhr = new ActiveXObject(versions[i]);
                              curxhr = versions[i];
                              createXHR = function () {
                                  return new ActiveXObject(curxhr);
                              }
                              return xhr;
                          } catch (ex) {
                              //skip
                          }
                      }
                  } else {
                      throw new Error("No XHR object available.");
                  }
              }

       

      瀏覽器之間最大的差異,莫過(guò)于Dom操作,Dom操作也是前端應(yīng)用 中最頻繁的操作,前端的大多性能提升,均體現(xiàn)在Dom操作方面。下面看一個(gè)Dom操作方面的惰性函數(shù)定義例子:

      var getScrollY = function() {
      
          if (typeof window.pageYOffset == 'number') {
      
              getScrollY = function() {
                  return window.pageYOffset;
              };
      
          } else if ((typeof document.compatMode == 'string') &&
                     (document.compatMode.indexOf('CSS') >= 0) &&
                     (document.documentElement) &&
                     (typeof document.documentElement.scrollTop == 'number')) {
      
              getScrollY = function() {
                  return document.documentElement.scrollTop;
              };
      
          } else if ((document.body) &&
                     (typeof document.body.scrollTop == 'number')) {
      
            getScrollY = function() {
                return document.body.scrollTop;
            }
      
          } else {
      
            getScrollY = function() {
                return NaN;
            };
      
          }
      
          return getScrollY();
      }

       惰性函數(shù)定義應(yīng)用還體現(xiàn)在創(chuàng)建單例上:

      unction Universe() {
      
          // 緩存的實(shí)例
          var instance = this;
      
          // 其它內(nèi)容
          this.start_time = 0;
          this.bang = "Big";
      
          // 重寫(xiě)構(gòu)造函數(shù)
          Universe = function () {
              return instance;
          };
      }

      當(dāng)然,像上面這種例子有很多。惰性函數(shù)定義,應(yīng)用場(chǎng)景我們可以總結(jié)一下:

      1 應(yīng)用頻繁,如果只用一次,是體現(xiàn)不出它的優(yōu)點(diǎn)出來(lái)的,用的次數(shù)越多,越能體現(xiàn)這種模式的優(yōu)勢(shì)所在;

      2 固定不變,一次判定,在固定的應(yīng)用環(huán)境中不會(huì)發(fā)生改變;

      3 復(fù)雜的分支判斷,沒(méi)有差異性,不需要應(yīng)用這種模式;

       

      posted @ 2013-11-26 00:32  穆乙  閱讀(8465)  評(píng)論(14)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲一区二区三区久久受| 色综合久久中文综合久久激情 | 国产三级视频网站| 中文有无人妻vs无码人妻激烈| 亚洲欧美综合人成在线| 亚洲爆乳WWW无码专区| 酒店大战丝袜高跟鞋人妻| av老司机亚洲精品天堂| 水蜜桃精品综合视频在线| 日韩精品亚洲精品第一页| 在线高清免费不卡全码| 欧美黑人又粗又大又爽免费| 亚洲AV午夜成人无码电影| 中文字幕亚洲人妻系列| 部精品久久久久久久久| 激情五月开心婷婷深爱| 亚洲精品久久久久久久久久吃药| 宅男噜噜噜66在线观看| 在线免费成人亚洲av| 平乐县| 国产精品一区二区久久岳| 国产资源精品中文字幕| 亚洲 欧美 综合 另类 中字| 玩弄放荡人妻少妇系列| 精品午夜福利在线观看| 在线a级毛片无码免费真人| 影音先锋大黄瓜视频| 亚洲欧美精品在线| 亚洲午夜爱爱香蕉片| 国产精品一区二区久久精品 | 中文字幕无线码中文字幕| 国产精品人妻一区二区高| 黑人强伦姧人妻久久| 亚洲av成人无码天堂| 免费拍拍拍网站| 亚洲第一成人网站| 国产成AV人片久青草影院| 99国内精品久久久久久久| 日产日韩亚洲欧美综合下载| 亚洲国产良家在线观看| 潮安县|