2016-05-13 12 views
0

Laut Hubfunktionsausdrucken können Ausdrücke erst aufgerufen werden, nachdem sie definiert wurden. Ich habe ein Modul erstellt, in dem ich versuche, auf die IIFE-Funktionen zuzugreifen, bevor das IIFE definiert ist. Nach meinem Verständnis sollte es einen Fehler gegeben haben, dass cookieManager.setPerstistantCookie ist keine Funktion, aber es funktioniert gut. Warum?Kann den Funktionsausdruck verwenden, bevor er definiert wird

$(function(){ 

     var selectedContainerClassName = $('.mtaa-iml-dropdwn-options li.mtaa-iml-selected').data('parent'); 
     cookieManager.setPersistentCookie(cookieManager.getCookieNameByComponent('imlookingTo') , selectedContainerClassName); 

}); 

    var cookieManager = (function(){ 

     var cookieEnum = { 
      imlookingTo : "selectedUIContainer" 
     } 

     function getPerstistentCookieExpiryTime(){ 
      var expiration_date = new Date(); 
      expiration_date.setFullYear(expiration_date.getFullYear() + 1); 
      return expiration_date.toGMTString(); 
     } 

     var setPersistentCookie = function(cname, cvalue) { 
      var expires = "expires="+ getPerstistentCookieExpiryTime(); 
      document.cookie = cname + "=" + cvalue + "; " + expires; 
     } 



     return { 
      setPersistentCookie : setPersistentCookie, 
      getCookieNameByComponent : getCookieNameByComponent 
     } 

})(); 
+1

* Timing-weise * '$ (..)' muss nach dem Rest des Codes ausgeführt werden, vermutlich weil '$()' explizit auf das Laden des DOM wartet, was in Ihrem Fall nicht passiert ist noch. (Nun, das ist ein Satz.) – deceze

+0

Sie erhalten nur einen Fehler, wenn Sie versuchen, es vor der Zuweisung aufzurufen. Solange * cookieManager * definiert ist (es wird mit * var * deklariert), ist alles in Ordnung. – RobG

+1

Ein Funktionsausdruck wird nicht gehisst. Nur Deklarationen werden gehostet. – Amit

Antwort

2

Sie haben die Funktion eingewickelt, die in einem jQuery "ready" Handler cookieManager bezieht. Dieser Code wird erst ausgeführt, wenn das DOM bereit ist. Zu diesem Zeitpunkt ist das Objekt definiert. Sie verwenden es nicht, bevor es definiert wurde, mit anderen Worten.

+0

Es sollte darauf hingewiesen werden, dass dies ist wirklich kein Verhalten, auf das Sie sich verlassen sollten ... – deceze

+0

auch CookieEnager ist ein IIFE – brk

+1

@ user2181397-das ist irrelevant. Die RHS wird ausgewertet und ein Wert zurückgegeben, es ist nicht wichtig, ob das von einem IIFE oder einer anderen Art von Ausdruck ist. – RobG

0

Sorry Leute mein schlechtes Ich hatte Recht mit dem Heben es funktioniert nicht und es sollte nicht funktionieren, wie ich es interpretierte. Der Grund, warum es so war, war, dass ich das gleiche Skript-Snippet über das $(function(){}) Snippet kopiert hatte, das ich aus Versehen vergessen habe zu entfernen. Irgendwelche Möglichkeiten, danke für die Hilfe.