2017-10-20 82 views
0

我想緩存APP.findUrlParameter()中變量「url」的結果。當第二次執行該函數時,url不應該被定義,但不幸的是。Javascript:關閉內緩存不起作用

例如URL:mypage.com?test=123 &名稱=湯姆

(function() { 
var APP = { 

    urlParameterPairs: function() { 

     var url; 


     if (window.location.search) { 
      url = window.location.search; 
      url = url.substring(1).split('&'); 
      $.each(url, function (i) { 
       url[i] = url[i].split('='); 
      }); 
     } 
     return url; 
    }, 

    findUrlParameter: function (key) { 
     var url; // <---- to be cached ! 
     console.log(url); 

     return (function() { 
      var result; 

      url = url || APP.urlParameterPairs(); 
      $.each(url, function (i) { 
       var pair = url[i]; 
       if (pair[0] === key) { 
        result = pair[1]; 
        return false; 
       } 
      }); 
      return result; 
     }()); 
    } 
}; 
console.log('name: ' + APP.findUrlParameter('name')); 
console.log('test: ' + APP.findUrlParameter('test')); 
}()); 

日誌:

  • 未定義
  • 名:湯姆
  • 未定義
  • 試驗:123

預期:

  • 未定義
  • 名:湯姆
  • 陣列:[ 「名稱」, 「湯姆」],[ 「測試」, 「123」]
  • 測試:123
+1

每次調用函數'findUrlParameter'你重新分配變量'url',那麼你怎麼能緩存呢? –

+0

在函數內部聲明變量將在每次函數評估時創建一個新變量。 – Bergi

+0

謝謝,你是對的,那沒什麼意義,我正在嘗試。我以錯誤的方式使用閉包。我現在可以修復它,看我的答案。 –

回答

0

感謝您的答案,當然「url」得到重新宣佈,愚蠢的我沒有注意到。我可以包裝它周圍的關閉和恢復這樣的功能解決這個問題:

findUrlParameter: (function() { 
     var url; 

     function f(key) { 
      var result; 

      url = url || APP.urlParameterPairs(); 
      $.each(url, function (i) { 
       var pair = url[i]; 
       if (pair[0] === key) { 
        result = pair[1]; 
        return false; 
       } 
      }); 
      return result; 
     } 
     return f; 
    }())