Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我删除的函数不是“typeof”;“未定义”;在Node.js中?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么我删除的函数不是“typeof”;“未定义”;在Node.js中?

Javascript 为什么我删除的函数不是“typeof”;“未定义”;在Node.js中?,javascript,node.js,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

我正在使用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

delete
仅用于删除对象符号的属性,不用于根据删除声明的变量

您发布的代码片段与此处的内容几乎完全相同

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

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


您不应该对标识符(在范围变量、函数-as
sum
或函数参数中)使用
delete
运算符

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

当您将变量声明为函数声明或函数参数时,这些标识符在幕后实际上是属于声明它们的当前范围的属性

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

编辑

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

eval('var sum = function () {}');
typeof sum; // "function"
delete sum; // true
typeof sum; // "undefined"
您也可以在控制台上看到这是如何发生的:


你正在读的那本书可能就是这样的,作者在控制台上根据
eval

它返回了什么进行了测试?功能,我假设,但只是检查。它对我有效(在Firebug中)。此外,您还缺少一个
@SLaks-当你说“它对我有用”时,那到底是什么意思?@SLaks-嗯。。。实际上,在Firefox 6.0.1/Firebug中给我
函数3
。@JaredFarrish,Firebug的控制台在幕后使用
eval
,eval代码上的可变环境绑定是可变的,这就是为什么
delete
实际上在那里工作的原因。。。Try:
(函数(){eval('var a');返回delete a;})()
您将看到
delete a
成功返回
true
。。。我可能会在我的答案上对此进行扩展……你提到的那篇文章是指我提到的同一本书to@EhevuTov当前位置从你对这个问题的评论中我意识到了这一点