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

我正在使用Node.js

我的“总和”function被删除后,我期望typeof(总和)返回“未定义”,但它不。

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

你不应该在标识符上使用delete操作符(在作用域variables,函数 – 作为sum或者函数参数)。

delete操作符的用途是删除对象属性

当你声明一个variables是一个函数声明或函数参数的时候,这些标识符实际上是一个属于当前声明范围的环境logging的属性。

这些属性在内部明确定义为不可configuration的 ,它们不能被删除。 而且, delete操作符的用法被误导了,在ES5严格模式下,它对标识符的使用已被完全禁止, delete sum; 应该抛出一个ReferenceError

编辑

正如问题注释中提到的@SLacks一样, delete操作符也可以使用Firebug控制台的标识符,这是因为Firebug使用eval来执行您在控制台中input的代码,以及由eval执行的代码中实例化的标识符的variables环境绑定,是可变的 ,这意味着它们可以被删除,这大概是允许程序员在运行时删除带有eval的dynamic声明variables,例如:

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

您可以在控制台上看到如何发生这种情况:

萤火-EVAL-码

这可能是你正在阅读的书发生了什么,作者在一个基于eval的控制台上进行了testing。

delete仅用于删除对象符号的属性,并不用于删除所声明的variables。

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

编辑:上面引用的相同的文章澄清出现在Firebug以及本节中的不一致。 相关摘录:

控制台中的所有文本似乎都被parsing并作为Eval代码执行,而不是全局或函数。 显然,任何声明的variables最终都是作为没有DontDelete的属性,因此可以很容易地删除。 请注意常规全局代码和Firebug控制台之间的这些差异。