2011-10-02 12 views
5

Sto usando Node.js.Perché la funzione eliminata non è di tipo "non definito" in Node.js?

Dopo che la funzione "somma" viene eliminata, mi aspetto che il tipo di (somma) restituisca "indefinito", ma non lo è.

// functions are data in Javascript 

var sum = function (a,b) { return a + b; } 
var add = sum; 
delete sum; 
console.log (typeof sum); // should return undefined 
console.log (typeof add); // should return function 
console.log (add(1,2)); // should return 3 

penserei deve restituire:

undefined 
function 
3 

Ma invece restituisce:

function 
function 
3 
+2

Cosa restituisce? funzione, presumo, ma solo controllo. –

+0

Funziona per me (in Firebug). Inoltre, ti manca un ';'. – SLaks

+1

@SLaks - Quando dici "Funziona per me", cosa significa esattamente? –

risposta

12

Non utilizzare l'operatore delete sugli identificatori (in variabili di ambito, funzioni - come sum - o argomenti di funzione).

Lo scopo dell'operatore delete è quello di eliminare le proprietà dell'oggetto .

Quando si dichiara una variabile, una dichiarazione di funzione o argomenti di funzione, dietro le quinte questi identificatori sono in realtà proprietà che appartengono allo scope corrente in cui sono stati dichiarati environment record.

Queste proprietà sono definite esplicitamente internamente come non configurabili, non possono essere eliminate. Inoltre, l'utilizzo dell'operatore delete è stato così frainteso che in modalità Strict ES5, il suo utilizzo sugli identificatori è stato completamente disabilitato, delete sum; dovrebbe generare un ReferenceError.

Edit:

Come @SLacks notato nei commenti questione, l'operatore delete funziona con identificatori dalla console del Firebug, è perché il Firebug utilizza eval per eseguire il codice immesso nella console, e l'ambiente variabile binding di identificatori istanziati nel codice eseguiti da eval, sono mutabili, il che significa che possono essere cancellati, questo era probabilmente per consentire al programmatore di eliminare in fase di esecuzione dichiarato in modo dinamico le variabili con eval, ad esempio:

eval('var sum = function() {}'); 
typeof sum; // "function" 
delete sum; // true 
typeof sum; // "undefined" 

Si può vedere come questo accade anche sulla console:

firebug-eval-code

E questo è probabilmente quello che è successo con il libro che si sta leggendo, l'autore ha fatto le sue prove su una console basata su eval.

11

delete è solo per l'eliminazione di proprietà di notazioni degli oggetti e non per cancellare le variabili dichiarate come per this article.

Lo snippet che hai postato è quasi esattamente come lo hai qui.

MODIFICA: lo stesso articolo di cui sopra chiarisce l'incoerenza che appare in Firebug anche in this section. estratto rilevanti:

Tutto il testo in console sembra essere analizzato ed eseguito come codice Eval, non come una funzione globale o uno. Ovviamente, qualsiasi variabile dichiarata finisce come come proprietà senza DontDelete, e quindi può essere facilmente cancellata. Sii consapevole di queste differenze tra il normale codice globale e la console Firebug .

+0

l'articolo a cui fai riferimento si riferisce al lo stesso libro che mi riferisco a – EhevuTov

+0

@EhevuTov: l'ho capito dal tuo commento sulla domanda –

Problemi correlati