2015-05-25 17 views
5

Ho ereditato un'applicazione e vedo questa struttura JavaScript ovunque. Qual è il motivo per cui lo ha creato. Capisco che si tratta di una funzione anonima e che PaymentOffersOverview viene passato ad esso.Come funziona questa funzione/esecuzione automatica di javascript

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

Ma quello che non capisco è l'ultima riga. })(PaymentOffersOverview); Perché viene passato di nuovo?

// Then the code can be used as follow 

alert(PaymentOffersOverview.App.Settings.Id); 

Fiddle

+1

l'ultima riga è il valore del primo parametro accettato dalla funzione anonima. – Blauharley

+1

Penso che devi leggere su IIFE http://benalman.com/news/2010/11/immediately-invoked-function-expression/ –

+0

@DavidJones - Grazie, credo che il problema fosse che non ero sicuro cosa cercare – R4nc1d

risposta

0

Non viene più passato di nuovo. Nell'ultima riga, la chiusura ottiene lo PaymentOffersOverview in quanto si autoinvoca. Se non è stato superato, lo PaymentOffersOverview all'interno della chiusura sarebbe 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

Grazie, in realtà ha perfettamente senso ora. La cosa strana per me è che PaymentOffersOverview è passato alla funzione con lo stesso nome dell'oggetto dichiarato in alto. Quindi la variabile param ha più senso. – R4nc1d

Problemi correlati