为什么我的删除函数在Node.js中不是typeof“undefined”?

时间:2011-10-02 02:30:47

标签: javascript node.js

我正在使用Node.js.

在我的“sum”函数被删除之后,我希望typeof(sum)返回“undefined”,但它没有。

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

我认为它应该回归:

undefined
function
3

但它会返回:

function
function
3

2 个答案:

答案 0 :(得分:12)

你不应该在标识符上使用delete运算符(在范围变量,函数 - 作为sum - 或函数参数)。

delete运算符的目的是删除对象属性

当你声明一个变量一个函数声明或函数参数时,这些标识符实际上是属于当前作用域的environment record的属性。

这些属性在内部明确定义为不可配置,不能删除它们。此外,delete运算符的使用一直是如此误解,以至于在ES5严格模式下,它在标识符上的使用已被完全禁止,delete sum;应该抛出ReferenceError

修改

正如@SLacks在问题评论中指出的那样,delete运算符可以使用Firebug控制台中的标识符,这是因为Firebug使用eval来执行您在控制台中输入的代码,以及在由eval执行的代码中实例化的标识符的变量环境绑定是 mutable ,这意味着它们可以被删除,这可能是允许程序员在运行时删除动态声明的变量与eval ,例如:

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

您可以在控制台上看到这种情况:

firebug-eval-code

这可能就是你正在阅读的书中发生的事情,作者在基于eval的控制台上进行了测试。

答案 1 :(得分:11)

delete仅用于删除对象表示法的属性,而不是用于按this article删除声明的变量。

你发布的片段几乎就像你在这里一样。

编辑:上面引用的同一篇文章澄清了Firebug中出现的不一致性this section。相关摘录:

  

控制台中的所有文本似乎都被解析并作为Eval代码执行,   不是全局或功能的。显然,任何声明的变量都会结束   作为没有DontDelete的属性,因此可以轻松删除。是   了解常规全局代码和Firebug之间的这些差异   控制台。