2017-10-20 24 views
0

J'essaie de mettre en cache le résultat de la variable "url" dans APP.findUrlParameter(). Lors de l'exécution de la fonction la 2ème fois, l'URL ne devrait plus être indéfinie, mais malheureusement elle l'est.Javascript: La mise en cache dans la fermeture ne fonctionne pas

exemple url: mypage.com?test=123 & name = tom

(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')); 
}()); 

journaux:

  • non définie
  • nom: test de tom
  • non définie
  • : 123

prévu:

  • non définie
  • nom: tom
  • Tableau: [ "nom", "tom"], [ "test", "123"]
  • test: 123
+1

Chaque fois que vous appelez la fonction 'findUrlParameter' vous Réaffectation la variable' url', alors comment pourriez-vous mettre en cache? –

+0

La déclaration de la variable dans la fonction va créer une nouvelle variable à chaque fois que la fonction est évaluée. – Bergi

+0

Merci, vous avez raison, cela n'a pas beaucoup de sens ce que j'essayais. J'utilisais la fermeture d'une mauvaise façon. Je pourrais le réparer maintenant, voir ma réponse. –

Répondre

0

Merci pour les réponses, bien sûr "url" est redéclaré, stupide, je n'ai pas remarqué. Je pouvais le résoudre avec enroulant une fermeture autour d'elle et en retournant une fonction comme ceci:

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; 
    }())