Proseguiamo il nostro studio sulla sicurezza con qualcosa di più raffinato ed efficace cercando di impedire l'accesso al gioco limitando la visibilità di funzioni e variabili del nostro codice al mondo esterno.
Come spiegato in precedenza se una proprietà o un metodo sono definiti al di fuori di una funzione essi sono considerati globali e quindi accessibili dall'esterno, si pensi ad esempio alla console javascript del browser o a file inclusi nel nostro codice da malintenzionati.
In Javascript, è possibile nidificare le funzioni, pensiamo a come viene dichiarato un oggetto:
function funzioneEsterna() { function funzioneInterna() { // codice } }Se prendiamo in esame l'esempio precedente vediamo che è possibile chiamare funzioneEsterna(), ma la visibilità della funzioneInterna() si limita al campo di applicazione della funzioneEsterna(), ciò significa che funzioneInterna è un metodo privato di funzioneEsterna().
Ne deriva sostanzialmente lo stesso principio delle variabili in Javascript:
var variabileGlobale; function funzioneEsterna() { var variabileLocale; }Che in termini di funzioni corrisponde a:
function funzioneGlobale() { var funzioneLocale1 = function() { // Sono una funzione anonima ma funzioneLocale1 è un riferimento a me }; function funzioneLocale2() { // Sono una funzione nominata } }Nello scenario precedente, è possibile chiamare funzioneGlobale() da qualsiasi punto del codice, ma non si può chiamare funzioneLocale1 o funzioneLocale2.
Quello che facciamo scrivendo (function () {... codice ...}) (), è inserire il codice all'interno di una funzione letterale (nel senso che tutto l 'oggetto è in realtà una funzione). Dopo di che, si sta auto-richiamando la funzione (le parentesi () alla fine).
Il grande vantaggio di questo metodo, come ho detto prima, è che si possono avere metodi, funzioni e proprietà private:
(function() { var variabilePrivata; function funzionePrivata() { // codice } })()La cosa interessante è che si possono anche definire cose all'interno ed esporle al mondo esterno in questo modo:
var myPlugin = (function() { var variabilePrivata; function funzionePrivata() { } return { funzionePubblica1: function() { }, funzionePubblica2: function() { } } })()In questo caso sarà possibile richiamare myPlugin.funzionePubblica1(), ma non sarà possibile accedere a funzionePrivata().