Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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 可以在node.js中配置函数名吗?_Javascript_Node.js_Ecmascript 6 - Fatal编程技术网

Javascript 可以在node.js中配置函数名吗?

Javascript 可以在node.js中配置函数名吗?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,我正在尝试编写一些javascript来运行客户端和服务器端。我想动态重命名函数(以帮助调试等)。 我有以下代码: function genericFunction() {} Object.defineProperty(genericFunction, 'name', {writable: true}); genericFunction.name = 'specificFunction'; console.log(genericFunction.name); 在chrome(v43)中,这会按

我正在尝试编写一些javascript来运行客户端和服务器端。我想动态重命名函数(以帮助调试等)。 我有以下代码:

function genericFunction() {}
Object.defineProperty(genericFunction, 'name', {writable: true});
genericFunction.name = 'specificFunction';
console.log(genericFunction.name);
在chrome(v43)中,这会按预期输出“specificFunction”。然而,在node.js(v0.10)中,我得到:

TypeError:无法重新定义属性:name

我做了一些调试,这似乎是由于

console.log(Object.getOwnPropertyDescriptor(function () {}, 'name').configurable);
在chrome上这是真的,但node.js输出为假

我(非常有限)的理解是,对于函数名,configurable应该始终为true。
我在阅读说明书时有没有遗漏什么?node.js是否使用了另一个说明名称不应配置的规范?还是我遇到了一个真正的bug?

虽然以前根本没有指定,但函数的类型在许多引擎中是一个非标准特性,这使得属性不可写且不可配置

在第6版ECMAScript中,这一点已经改变,
.name
现在是函数实例的官方指定属性。然而,许多发动机尚未采用这种变化

它在您的Chrome浏览器中工作表明V8的一个较新版本支持此功能。考虑更新你的No.js,或者切换到IO。JS.< /P>
可以在node.js中配置函数名吗

正如您所确定的,没有(或者至少目前没有)

我对规范(非常有限)的理解是,对于函数名,configurable应该始终为true

我在阅读说明书时有没有遗漏什么

没有

node.js是否使用了另一个说明名称不应配置的规范

没有

还是我碰到了一只真正的虫子


我称之为“缺失功能”,而不是bug。Node尚未声明支持ES6,因此,虽然他们确实计划在将来这样做,但目前这并不是一个真正的bug。

在节点v.0.12.2中,函数对象上的
.name
属性不能更改,因为函数对象上的name属性默认为
可写:false
可配置:false
,因此无法使其可写

这与ES6不一致。由于Chrome当前的实现在这方面与ES6是一致的,因此我们可以假设node在V8引擎版本中刚好落后,并且一些未来的版本将解决这个问题。注意:带有节点的
--harmony
标志也不会更改此行为


下面是node v.0.12.2和Chrome 44.0.2403.130 m之间的技术差异

在节点v.0.12.2中,如果执行此操作:

function f() {}
console.log(Object.getOwnPropertyDescriptor(f, "name"));
它输出:

{value: 'f', writable: false, enumerable: false, configurable: false}
如您所见,无法写入
.name
属性,也无法将其重新配置为可写


在Chrome 44.0.2403.130 m中,您可以看到:

{"value":"f","writable":false,"enumerable":false,"configurable":true }
默认情况下无法写入,但由于它是可配置的,因此可以将其更改为可写,然后再更改name属性


这大概是因为Chrome运行的是更新版本的V8引擎。根据,Chrome配置看起来像是正确的默认配置


如果您在最新的Chrome中运行此代码,您可以看到它可以工作:

函数f(){}
var别名=f;
日志(Object.getOwnPropertyDescriptor(f,“name”);
//此名称更改将不起作用,因为writable==false
日志(别名.name);
f、 name=“foo”;
日志(别名.name);
//将可写更改为true
defineProperty(f,“name”,{writeable:true});
日志(Object.getOwnPropertyDescriptor(f,“name”);
//这个名字的改变会起作用的
f、 name=“foo”;
日志(别名.name);
//将输出放入代码段主窗口的实用函数
函数日志(args){
var str=“”;
for(var i=0;i}
Node v0.10并不声称与ES6完全兼容(事实上,它对ES6的支持相当有限)。请参阅@jfriend00-您误解了规范。@jfriend00 writeable默认为false,但configurable为true。因此,我的行
Object.defineProperty(genericFunction,'name',{writeable:true})从那时起可写更改为true。(至少在遵循规范的地方)@jfriend00-可写的
与可配置的
之间有区别-是的,但这意味着默认情况下,除非首先将可写更改为true,否则无法设置.name属性。我的问题已经指出,可配置在Chrome中为true,但在node中为false。@lucas-和,我解释说ES6规范与最新的Chrome实现是一致的,node只是落后于时代。还有什么比这更多的答案呢?由于此可配置性问题,您现在无法在节点中配置函数名。您的回答没有告诉我关于节点的任何问题。您已经详细介绍了Chrome的实现,但我已经知道这是可行的。@lucas-您标题中的问题的答案是“否,您不能在当前版本的node中设置函数对象的
.name
属性”。我的回答是准确的,其余的解释是为什么这是真的,我认为这是有用的充分理解(至少它对我有用)。关于这个问题,你还想知道些什么?