javascript - node.js 可以配置函数名吗?

标签 javascript node.js ecmascript-6

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

function genericFunction() {}
Object.defineProperty(genericFunction, 'name', {writable: true});
genericFunction.name = 'specificFunction';
console.log(genericFunction.name);

在 chrome (v43) 中,这会按预期输出“specificFunction”。但是,在 node.js (v0.10) 中,我得到:

TypeError: Cannot redefine property: name

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

的输出之间的差异所致
console.log(Object.getOwnPropertyDescriptor(function () {}, 'name').configurable);

在 chrome 上它是 true,但是 node.js 输出 false。

我对 the spec 的(非常有限的)理解是对于函数名称,configurable 应该始终为真。 我在阅读规范时错过了什么吗? node.js 是否使用不同的规范来说明名称不应该是可配置的?还是我偶然发现了一个真正的错误?

最佳答案

Function 对象的 .name 属性不能在 Node v.0.12.2 中更改,因为 Function 对象的 name 属性默认为 writable: false configurable: false 所以没有办法让它可写。

这与 ES6 不一致。由于 Chrome 的当前实现在这方面与 ES6 一致,我们可以假设 Node 在 V8 引擎版本中落后,并且一些 future 版本将修复此问题。注意:带 Node 的 --harmony 标志也不会改变此行为。


这是 Node v.0.12.2 和 Chrome 44.0.2403.130 m 之间的技术差异。

在 Node 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 }

默认情况下您不能写入它,但因为它是可配置的,您可以将其更改为可写,然后再更改名称属性。


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


如果您在最新的 Chrome 中运行此代码,您会看到它有效:

function f() {}
var alias = f;

log(Object.getOwnPropertyDescriptor(f, "name"));

// this name change will not work because writable === false
log(alias.name);
f.name = "foo";
log(alias.name);

// change writable to true
Object.defineProperty(f, "name", {writable: true});
log(Object.getOwnPropertyDescriptor(f, "name"));

// this name change will work
f.name = "foo";
log(alias.name);

// utility function to put output into main window for snippet
function log(args) {
    var str = "";
    for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === "object") {
            str += JSON.stringify(arguments[i]);
        } else {
            str += arguments[i];
        }
    }
    var div = document.createElement("div");
    div.innerHTML = str;
    var target = log.id ? document.getElementById(log.id) : document.body;
    target.appendChild(div);
}

关于javascript - node.js 可以配置函数名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31977822/

相关文章:

javascript - 使用 jQuery 检索类名的首选方法是什么?

javascript - jquery ajax : call function when all requests are complete

javascript - 选择单选按钮后刷新页面但保留单选按钮值

node.js - 勒纳。将依赖项安装到根项目

node.js - 生成的访问 token 对于演示视频应用程序无效

javascript - 在不带 .doc 扩展名的 Word 中打开 Word 文档链接(重定向)

node.js - 用于模式定义的 Mongoose 或 MongoDB?

javascript - 如何将 redux 与 fela 一起使用并使用react?

javascript - Chrome 调试器中的 ES6 (React) 不起作用

javascript - react 和流动 : import Node type and PureComponent in one line