1. 程式人生 > >js高階技巧之惰性載入函式

js高階技巧之惰性載入函式

開發十年,就只剩下這套架構體系了! >>>   

  • 因為瀏覽器間行為的差異,多數javascript程式碼包含大量的if判斷語句,為避免每次函式呼叫都去執行那些沒有必要的if判斷語句
  • 實現惰性載入函式的方法有兩種:
    • 在函式執行的時候在處理函式,在函式第一次呼叫的過程中,該函式會被重寫覆蓋成另一個按照合適方式執行的函式,下面見例子:建立XHR
      function createXHR () {
          if (typeof XMLHttpRequest != 'undefined') {
              return new XMLHttpRequest();
          } else if (typeof ActiveXObject != 'undefined') {
              if (typeof arguments.callee.activeXString != 'string'){
                  var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'],
                  i,len;
                  for (i = 0,len=version.length; i < len; i++) {
                      try {
                          new ActiveXObject(version[i]);
                          arguments.callee.activeXString = versions[i];
                          break;
                      } catch (ex) {
                          // 跳過
                      }
                  }
              }
              return new ActiveXObject(arguments.callee.activeXString);
          } else {
              throw new Error('NO XHR');
          }
      }
      
      每次執行這個建立函式都會去執行內部的那些判斷語句,所以見如下改寫該函式,重寫原函式,下一次呼叫時就會直接呼叫分配好的函式
      function createXHR () {
          if (typeof XMLHttpRequest != 'undefined') {
              // 改寫原函式
              createXHR = function () {
                  return new XMLHttpRequest();
              }
          } else if (typeof ActiveXObject != 'undefined') {
              // 改寫原函式
              createXHR = function () {
                  if (typeof arguments.callee.activeXString != 'string'){
                      var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'],
                      i,len;
                      for (i = 0,len=version.length; i < len; i++) {
                          try {
                              new ActiveXObject(version[i]);
                              arguments.callee.activeXString = versions[i];
                              break;
                          } catch (ex) {
                              // 跳過
                          }
                      }
                  }
                  return new ActiveXObject(arguments.callee.activeXString);
              }
          } else {
               createXHR = function () {
                  throw new Error('NO XHR');
               }
          }
          // 最後返回預期
          return createXHR();
      }
      
    • 第二種惰性載入的方式是在宣告函式時就指定適當的函式,見下面改寫,該例子中使用匿名、自執行函式:
      var createXHR = (function () {
          if (typeof XMLHttpRequest != 'undefined') {
              // 返回分配好的函式
              return function () {
                  return new XMLHttpRequest();
              };
          } else if (typeof ActiveXObject != 'undefined') {
               // 返回分配好的函式
             return function () {
                  if (typeof arguments.callee.activeXString != 'string'){
                      var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'],
                      i,len;
                      for (i = 0,len=version.length; i < len; i++) {
                          try {
                              new ActiveXObject(version[i]);
                              arguments.callee.activeXString = versions[i];
                              break;
                          } catch (ex) {
                              // 跳過
                          }
                      }
                  }
                  return new ActiveXObject(arguments.callee.activeXString);
              };
          } else {
               return function () {
                  throw new Error('NO XHR');
               };
          }
      })()