2015-12-04 12 views
6

Sto usando la funzione eval in un modo strano, come costruttore.Non sono anche tutti i costruttori di funzioni JavaScript?

try { 
    var y = new eval() 
} catch(error) { 
    console.log("caught a " + error.name + ": " + error.message); 
} 

Getta errore come,

caught a TypeError: function eval() { [native code] } is not a constructor 

Come il messaggio di errore mostra, eval è una funzione, ma non un costruttore.

La domanda è, non tutte le funzioni javascript fungono anche da costruttori?

+0

eval è una parola chiave riservata/una funzione nativa. Non scherzare. –

+2

No, alcune altre eccezioni notabili sono alcuni metodi _DOM_ e _arrow functions_ 'x => undefined' –

+0

Concordato, eval è una funzione incorporata. Se hai creato la tua funzione 'myEval() {}' e poi hai usato quel codice, dovrebbe andare bene. –

risposta

6

Non tutte le funzioni sono costruttori.

I costruttori sono function values with a [[Construct]] internal property, che non tutte le funzioni hanno. Questo è fatto esplicito 6.1.7.2 Object Internal Methods and Internal Slots della specifica lingua:

Una funzione oggetto non è necessariamente un costruttore e tali oggetti funzione non-costruttore non hanno un metodo [[costruire]] interno.

Utilizzando new o Reflect.construct di chiamare un non-costruttore come un costruttore lancia un TypeError.

+0

Quali sono le implicazioni pratiche di questo? Se scrivo una funzione javascript, viene automaticamente codificata con questo metodo interno [[Costruisci]]? –

+0

@JohnCarpenter, dipende da come viene creata la funzione. Come indicato da @PaulS sopra, la creazione di una funzione utilizzando la sintassi della funzione freccia significa che non avrà la proprietà [[Costruisci]]. L'uso della parola chiave 'function' generalmente produce una funzione costruttibile. –

+0

Eh, aggiungi questo alla lista di cose che non sapevo che non sapevo. –

Problemi correlati