2011-10-02 19 views
5

Estoy usando Node.js.¿Por qué mi función eliminada no es typeof "undefined" en Node.js?

Después de que se elimine la función "suma", esperaría que el tipo de (suma) devuelva "indefinido", pero no es así.

// 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 

yo creo que debería volver:

undefined 
function 
3 

Pero en lugar Devuelve:

function 
function 
3 
+2

¿Qué devuelve? función, supongo, pero solo comprobando. –

+0

Funciona para mí (en Firebug). Además, te estás perdiendo un ';'. – SLaks

+1

@SLaks - Cuando dices "Funciona para mí", ¿qué significa eso exactamente? –

Respuesta

12

No debe utilizar el operador delete en identificadores (en variables de ámbito, funciones - como sum - o argumentos de funciones).

El propósito del operador delete es eliminar las propiedades del objeto .

Cuando declara una variable una declaración de función o argumentos de función, detrás de escena estos identificadores son en realidad propiedades que pertenecen al environment record del ámbito actual donde se declararon.

Esas propiedades están explícitamente definidas internamente como no configurables, no se pueden eliminar. Además, el uso del operador delete ha sido tan mal interpretado que en ES5 Strict Mode, su uso en los identificadores ha sido completamente rechazado, delete sum; debería arrojar un ReferenceError.

Editar:

Como @SLacks señaló en los comentarios de interrogación, el operador delete funciona con identificadores de consola de Firebug, eso es debido a que el Firebug utiliza eval para ejecutar el código que ha ingresado en la consola, y los enlaces de variables de entorno de identificadores instanciados en el código ejecutado por eval, son mutable, lo que significa que se pueden eliminar, esto era probablemente para permitir que el programador para eliminar en tiempo de ejecución declaró dinámicamente variables con eval, por ejemplo:

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

Se puede ver cómo esto ocurre también en la consola:

firebug-eval-code

Y eso es probablemente lo que sucedió con el libro que está leyendo, el autor hizo sus pruebas en una consola basada en eval.

11

delete es sólo para borrar propiedades de anotaciones de objetos y no para borrar las variables declaradas como por this article.

El fragmento que ha publicado está allí casi exactamente como lo tiene aquí.

EDITAR: El mismo artículo al que se hace referencia anteriormente aclara la incoherencia que aparece en Firebug también en this section. extracto relevante:

Todo el texto de la consola parece ser analizado y ejecutado como código de Eval, no como un Mundial o una función. Obviamente, las variables declaradas terminan en como propiedades sin DontDelete y, por lo tanto, se pueden eliminar fácilmente. Sea consciente de estas diferencias entre el código Global normal y la consola Firebug .

+0

que el artículo que refiere se está refiriendo al el mismo libro al que me refiero – EhevuTov

+0

@EhevuTov: me di cuenta de que a partir de su comentario sobre la pregunta –

Cuestiones relacionadas