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

Ehe*_*Tov 5 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
Run Code Online (Sandbox Code Playgroud)

我认为应该回归:

undefined
function
3
Run Code Online (Sandbox Code Playgroud)

但它返回:

function
function
3
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 12

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

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

当您向变量声明函数声明或函数参数时,在后台这些标识符实际上是属于声明它们的当前作用域的环境记录的属性.

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

编辑:

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

eval('var sum = function () {}');
typeof sum; // "function"
delete sum; // true
typeof sum; // "undefined"
Run Code Online (Sandbox Code Playgroud)

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

萤火-EVAL-码

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


Har*_*til 11

delete仅仅是删除对象符号的性质,而不是删除该声明的变量按照这篇文章.

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

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

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