gpt4 book ai didi

javascript - `obj.foo = function() { };` 为什么不给函数分配名称 `foo`?

转载 作者:IT王子 更新时间:2023-10-29 02:59:11 25 4
gpt4 key购买 nike

从 ES2015 (ES6) 开始,函数有专有名称(包括官方的 name 属性),并且在创建函数时除了明显的函数声明之外,还会以多种方式分配名称和命名函数表达式,例如赋值给变量(函数名设置为变量名),分配给对象属性(函数名设置为属性名),甚至函数参数的默认值(函数名设置为参数的姓名)。但是分配给现有对象的属性(例如,不在对象初始值设定项中)不会将该属性的名称分配给函数。为什么不?肯定有一个特定的原因,它是不可取的/不可能的。那是什么?

需要说明的是:我不是在问如何解决它。我在问是什么阻止了这个看似显而易见的案例在这么多其他案例(包括默认参数值!)被处理时被处理。必须有充分的理由。

请不要推测或理论化。TC39 有理由不包括它。我对那个原因很感兴趣。我经历过 TC39 meeting notes但还没有找到。到目前为止我找到的最接近的是 Allen Wirfs-Brock replying to Bergi说由于“各种反对意见”,没有就该表格达成共识,但遗憾的是他没有说出这些反对意见是什么。

详细信息:

以下所有将名称 foo 分配给 compliant browser 上的函数:

// Requires a compliant browser

// Assigning to a variable or constant...
// ...whether in the initializer...
{
let foo = function() { };
console.log("1:", foo.name); // "foo"
}
{
const foo = function() { };
console.log("2:", foo.name); // "foo"
}
// ...or later...
{
let foo;
foo = function() { };
console.log("3:", foo.name); // "foo"
}
// As an initializer for an object property
{
const obj = {
foo: function() { }
};
console.log("4:", obj.foo.name); // "foo"
}
// Or as a method
{
const obj = {
foo() { }
};
console.log("5:", obj.foo.name); // "foo"
}
// Even if it's a computed property name
{
let name = "f";
const obj = {
[name + "o" + "o"]() { }
};
console.log("6:", obj.foo.name); // "foo"
}
// As a default value for a parameter
(function(foo = function() { }) {
console.log("7:", foo.name); // "foo"
})();
// ...and a bunch of others

但是在对象初始值设定项之外分配给现有对象的属性不会:

const obj = {};
obj.foo = function() { };
console.log("Nope:", obj.foo.name);

据我所知,这包含在 this section 中规范的一部分,如果 LeftHandSideExpressionIsIdentifierRef 为真(对于属性引用显然是 it isn't),它明确地设置函数名称。

所以从上面重申:为什么不呢?肯定有一个特定的原因,它是不可取的/不可能的。那是什么?

最佳答案

Allen Wirfs-Brock 有 replied on the es-discuss list反对意见阻止了 TC39 就 obj.foo = function() { } 形式达成共识:

...for

cache[getUserSecret(user)] = function() {};

it would leak the secret user info as the value of name

and for

obj[someSymbol] = function() {}

it would leak the Symbol value as the value of name

and for

 table[n]=function() {}

name would likely be a numeric string

这些反对意见都有反驳(特别是最后一个,它非常薄弱;还有许多其他方法可以自动为函数分配一个数字字符串名称),但这不是重点;关键是那些是提出的反对意见。

他还补充说需要 IsPropertyReference 操作(目前只有一个 IsIdentifierRef)...

...is a runtime operation and the new semantics require runtime determination of the name value. This is all extra runtime work that may slow down the creation of function closures that appear within loops.

所以总而言之,显然在做出决定时,那些反对意见占了上风(现在很可能也会),这就是为什么这种形式不会自动命名函数,而许多其他形式会这样做。

关于javascript - `obj.foo = function() { };` 为什么不给函数分配名称 `foo`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41107548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com