重写命名函数的名称属性

Overriding name property of named functions

本文关键字:属性 函数 重写      更新时间:2023-09-26

我有一个命名函数,如下所示:

var foo = function ninjaFunc(){
};

在控制台中检查它的名称,我发现了"ninjaFunc",这是预期的:

console.log(foo.name); //-> "ninjaFunc"

我刚刚将foo.name重新分配给'aha'。它运行时没有任何错误。

foo.name = 'aha'; //compiles without error

但重新检查foo.name,我又找到了"ninjaFunc"。但我预计它会是"啊哈",因为编译器在分配它时没有引发错误

console.log(foo.name); //-> "ninjaFunc"

为什么会这样?我错过了哪个概念?

ECMAScript的标准参考是ECMA-262,即语言规范。当前标准ES5没有为函数实例指定名称属性。

然而,第6版的草案在§19.2.4.2中有规定:

此属性具有属性{[[Writable]]:false、[[Enumerable]]:false和[[Configuration]]:true}。

根据§6.1.7.1,它说你不能写(可写:false)。

实施可能已经实施了ed.6行为,也可能没有。您需要测试各种浏览器以确定支持(例如,IE 6和可能的更高版本不支持它)。