Differenza tra la funzione autoeseguibile di JavaScript e la funzione di costruzione in metodi privati

0

So che questo è stato chiesto molte volte in passato, ma ancora non capisco quale sia la differenza tra quanto segue:

var Foo =  function (){ //1
     this.a = "";
     this.b = "";
     var c = ""; //private member
   }
var instantiatedFoo = new Foo();

// and the same with closure

 var FooSelfEncapsulated = (function (){//2
   var a = "";
   var b = "";
   var c = "";
   return function (){//3
     this.a = a;
     this.b = b;
   }
 })();
var instantiatedFoo = new FooSelfEncapsulated();

C'è qualche differenza? Quando ognuno sarebbe appropriato?

Infine, è buona norma mettere gli stessi nomi nelle funzioni anonime (1,2,3) come mostrato? O non è necessario?

var Foo =  function Foo(){ //1
     this.a = "";
     this.b = "";
     var c = ""; //private member
   }
var instantiatedFoo = new Foo();

// and the same with closure

 var FooSelfEncapsulated = (function FooSelfEncapsulated(){//2
   var a = "";
   var b = "";
   var c = "";
   return function FooSelfEncapsulated(){//3
     this.a = a;
     this.b = b;
   }
 })();
var instantiatedFoo = new FooSelfEncapsulated();
    
posta gvivetapl 14.12.2017 - 10:52
fonte

1 risposta

1

Si utilizzerà il secondo esempio se si desidera che le proprietà siano diverse in base a determinati criteri. Poiché la funzione è auto-chiamata, ciò non è altrettanto utile, ma è possibile modificare dinamicamente la definizione dell'oggetto in fase di esecuzione. Potresti non voler aggiungere una funzione nell'oggetto reale perché le condizioni potrebbero cambiare e vuoi che gli oggetti creati siano coerenti.

Un tipo di esempio banale è che diciamo che vogliamo registrare se il giorno del mese in fase di runtime è pari o dispari:

var FooSelfEncapsulated = (function (){
   var date = new Date();
   var a = date.getDate() % 2 ? "Odd" : "Even";
   var b = "";
   var c = "";
   return function (){//3
     this.a = a;
     this.b = b;
   }
 })();
var instantiatedFoo = new FooSelfEncapsulated();

Facendo questo, se il codice fosse eseguito il 12/14 11:59:59 tutto FooSelfEncapsulated.a sarebbe "Even". Non vogliamo eseguire questo controllo nel nostro oggetto reale perché la data potrebbe essere cambiata e non vogliamo tenere traccia di quando accadono le cose (o potrebbe non esserci modo di sapere). Vogliamo che tutto il FooSelfEncapsulated sia lo stesso per questa particolare esecuzione del programma.

Il primo esempio, definiamo semplicemente un oggetto e non vi è alcuna possibilità di avere definizioni dinamiche come questa. Avere la confezione extra non rende davvero le cose più chiare.

Avere il secondo esempio di una funzione di auto-chiamata limita un po 'l'utilità di questa costruzione. Tuttavia, stai fondamentalmente definendo una funzione di fabbrica per la creazione dei diversi oggetti.

Per quanto riguarda la denominazione, tutto dipenderà da come le cose si confondono. Non penso che ci sarebbe una regola difficile su questo. Dipenderà da cos'altro sta accadendo. Nei tuoi esempi, avrebbe senso. Tuttavia, se le cose si complicano potrebbe essere difficile tenerne traccia.

    
risposta data 14.12.2017 - 22:26
fonte

Leggi altre domande sui tag