- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
从 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 中规范的一部分,如果 LeftHandSideExpression 的 IsIdentifierRef 为真(对于属性引用显然是 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/
public class Foo : IFoo ... 和有什么区别 IFoo foo = new Foo(); 和 Foo foo = new Foo(); 最佳答案 区别仅在于变量的声明类型。每当
class Foo { public: explicit Foo() {} explicit Foo(Foo&) {} }; Foo d = Foo(); error: no matc
是 foo as? Foo完全等同于 foo as Foo? ? 如果是,那为什么两者都有? 如果不是,那么有什么区别? 最佳答案 as?是 safe cast operator . 通常,如果您尝试
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: Why is there an injected class name? (1 个回答) 关闭5年前。 一位同事不小心写了这样的代码: struct foo { fo
我遇到了这些关键字::foo、::foo、::bar/foo 和 :bar/foo 您能举例说明差异吗? 最佳答案 :foo 是一个非完全限定的关键字。它没有关联的命名空间。 (name :foo)
有人问我如何简化这个 lambda (Foo foo) -> foo.getName() 还有更好的写法吗? 最佳答案 Foo::getName。 假设getName是一个实例方法,其签名中的参数列表
编写此规则集的 CSS 组合器或简写是什么? foo bar, foo biz, foo gaz > boo, foo tar { ... } 我很确定我在 MDN 的某处读到过有一个。是不是: f
我有一个用这个字符串填充的输入文本 "foo foo"但插入后字符串看起来像这样 "foo foo" .我该如何解决?我想以第一种格式显示字符串! 最佳答案 你可能有这样的事情: " /> 更改 va
假设我有一个不可复制类Foo,它的构造函数之一恰好接收到对 Foo 的引用。 class Foo { public: Foo(Foo& parent) {...} private: v
class Artist @@song_count = [] attr_accessor :name, :songs def initialize(name) @name = name
请解释为什么这些 Perl 函数的调用方式在函数定义之上决定了它们是否运行。 print "Why does this bare call to foo not run?\n"; foo; print
文件名分为三种类型 首先( Root 于某种“当前工作目录”之下) ../foo ./foo bar/foo # really in this group? 和( Root 于绝对路径,独立于 CWD
我想自动连接 foo: @Autowired Foo foo 但我无法修改类 Foo 并将其标记为 @Component。 Autowiring foo 最干净的方法是什么? 顺便说一句,如果您需要使
我一直在使用 Python 的 ElementTree 创建 XML 文档,到目前为止一切顺利。然而我现在面临的问题是,由于项目要求,我需要生成一个 XML 文档,其中包含带有开始和结束标签的元素以及
class Foo { public: Foo(){} private: Foo(const Foo &); }; Foo f(); Foo f1 = Foo(); 我发现当我将 Fo
我有一个 jquery 对话框,上面有一个按钮(我的按钮,不是对话框按钮之一)。 设置对话框后,我有以下代码: $('#bar').click(foo('baz')); 当我加载页面并显示对话框时,f
我遇到了以下变量的情况: var foo: Foo | Foo | Foo; 动态生成(使用 keyof 和 stuff),这在代码的那个点是完全有意的。但是,我需要调用像这样定义的对象内部的方法:
clang 3.5.0 和 gcc 4.9.1 从代码生成的可执行文件 #include struct Foo { Foo() { std::cout << "Foo()" << std::e
对于声明为 Foo& foo = ...; 的 foo,lambdas 的按值捕获和按引用捕获语义之间有什么区别吗? 最佳答案 我认为你已经陷入了一个常见的误解......引用是对真实对象的别名。初始
我是一名优秀的程序员,十分优秀!