2015-05-25 40 views
5

Odziedziczyłem aplikację i widzę tę strukturę JavaScript wszędzie. Jaki jest powód takiego tworzenia. Rozumiem, że jest to funkcja anonimowa i że zostanie mu przekazana PaymentOffersOverview.Jak działa ta funkcja javascript/Struktura działa

var PaymentOffersOverview = PaymentOffersOverview || {}; 

(function(PaymentOffersOverview) { 
    var App = {}; 

    App.Settings = { 
     Id: some Id value 
     // Some Code 
    }; 

    App.ShowLoader = function (message) { 
      // Some Code 
     }; 

    PaymentOffersOverview.App = App; 
})(PaymentOffersOverview); 

Ale to, czego nie dostaję, to ostatnia linia. })(PaymentOffersOverview); Dlaczego został ponownie wprowadzony?

// Then the code can be used as follow 

alert(PaymentOffersOverview.App.Settings.Id); 

Fiddle

+1

Ostatni wiersz jest wartością pierwszego parametru, który akceptuje twoja anonimowa funkcja. – Blauharley

+1

Myślę, że musisz przeczytać na IIFE http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+0

@DavidJones - Dzięki, zrobię, myślę, że problem polegał na tym, że nie byłem pewien na co zwrócić uwagę – R4nc1d

Odpowiedz

0

To nie przejdzie ponownie. W ostatniej linii zamknięcie otrzymuje wartość PaymentOffersOverview, ponieważ jest to samo-wywołanie. Jeśli nie zostałoby ono przekazane, PaymentOffersOverview w obrębie zamknięcia byłoby undefined.

// definition of local variable 
var PaymentOffersOverview = PaymentOffersOverview || {}; 

(function(param) { 
    // now we are in the context of the closure where param refers to 
    // PaymentOffersOverview, yet PaymentOffersOverview is not defined 
    // within this scope. It is param. 
    // You can use any name here, using the same is just for convinience. 
    var App = {}; 

    App.Settings = { 
     Id: some Id value 
     // Some Code 
    }; 

    App.ShowLoader = function (message) { 
      // Some Code 
     }; 

    param.App = App; 
})(PaymentOffersOverview); // passing of the variable 
+0

Dzięki, teraz ma to sens. Dziwne dla mnie było to, że PaymentOffersOverview został przekazany do funkcji o tej samej nazwie co obiekt zadeklarowany na górze. Zmienna paramowa ma więcej sensu. – R4nc1d