为什么 `obj.foo = function() { };` 没有将名称 `foo` 分配给函数?

2024-05-31

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

需要明确的是:我并不是在问如何解决这个问题。我问的是,当有这么多其他情况(包括默认参数值!)时,是什么阻止了这种看似明显的情况的处理。一定有一个很好的理由。

请不要猜测或推理。TC39 不包括它是有原因的。我很感兴趣那个原因是什么。我已经经历过TC39 会议记录 https://github.com/rwaldron/tc39-notes但还没找到。到目前为止我发现的最接近的是 Allen Wirfs-Brock回复 贝尔吉 https://esdiscuss.org/topic/name-anonymous-functions-on-property-assignments他说,由于“各种反对意见”,因此没有就该表格达成共识,但遗憾的是,他没有说明这些反对意见是什么。

Details:

以下所有分配名称foo到 a 上的函数兼容浏览器 https://kangax.github.io/compat-table/es6/#test-function_name_property:

// 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);

据我所知,这涵盖了本节 http://www.ecma-international.org/ecma-262/7.0/index.html#sec-assignment-operators-runtime-semantics-evaluation规范的,它明确地仅设置函数名称,如果是标识符引用 of the 左手边表达是真的(显然it isn't http://www.ecma-international.org/ecma-262/7.0/index.html#sec-static-semantics-static-semantics-isidentifierref供财产参考)。

所以重申上面的观点:为什么不呢?肯定一定有一个specific原因是它不理想/不可能。它以前如何?


艾伦·维尔夫斯-布洛克有在 es-讨论列表中回复 https://esdiscuss.org/topic/name-anonymous-functions-on-property-assignments#content-20反对意见阻碍了 TC39 达成共识obj.foo = function() { } form:

...for

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

它会泄露秘密用户信息作为名称的值

and for

obj[someSymbol] = function() {}

它将泄漏 Symbol 值作为 name 的值

and for

 table[n]=function() {}

名称可能是一个数字字符串

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

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

...是运行时操作,新语义需要运行时确定名称值。这些都是额外的运行时工作,可能会减慢循环中出现的函数闭包的创建速度。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 `obj.foo = function() { };` 没有将名称 `foo` 分配给函数? 的相关文章

  • JQuery:如何自动完成“城市,州”?

    Question 怎么用啊JQuery 自动完成插件 http docs jquery com Plugins Autocomplete建议地点 City State 用于输入字段 意思是 有人想输入 伊利诺伊州芝加哥 所以他们开始打字 C
  • 如何使用 WebStorm 在 TypeScript 而不是 JavaScript 中创建 Cucumber 步骤定义文件?

    I m building a new e2e test suite using Cucumber js and I d like to use TypeScript for my step files When I create a new
  • 如何在本机反应中发出触摸事件

    我正在尝试启用 panResponder 以拖放模式在屏幕上移动组件 然而 这种拖放必须通过longPress在这样的元素上 longPress捕获事件 所以当panResponder已启用onStartShouldSetPanRespon
  • Protractor - 等待多个元素

    我正在尝试等待页面上的多个元素 我不知道可能有多少个 但至少会有一个 我知道使用以下命令等待单个元素 效果很好 var EC protractor ExpectedConditions browser wait EC presenceOf
  • javascript获取网页中选定文本的段落

    突出显示文本后 我想获取所选文本所在的段落 var select window content document getSelection 请问有什么指点吗 这实际上很难做到 因为你必须考虑六种情况 所选内容不在一个段落内 简单 整个选择都
  • 有没有一种方法可以使页面布局在 100% 缩放下完美契合,同时又尊重更大的缩放系数?

    有多种方法可以布局网页 使其适合浏览器视口 DOMwindow 当我说 适合 时 我包括更改所用字体的大小 更改 DIV IMG 和其他渲染元素的宽度和高度 以及允许元素 流畅 移动 目标是使页面在所有显示设备 从小型手机到大桌面屏幕 上看
  • 更改 Angular 模型以更新 Kendo

    我一直在一个项目中使用 Angular 最近才发现 Kendo Angular 项目位于http kendo labs github io angular kendo http kendo labs github io angular ke
  • 如何重定向到另一个页面并从表中传递 url 中的参数?

    如何重定向到另一个页面并从表中传递 url 中的参数 我在龙卷风模板中创建了类似的东西 table thead tr th Username th th Nation th th Rank th th th tr thead tbody f
  • 将压缩的json数据存储在本地存储中

    我想将 JSON 数据存储在本地存储中 有时存储的数据可能超过 5MB 每个域的浏览器允许的最大阈值 无论如何 我可以压缩或压缩数据并将其存储在本地存储中吗 如果对大数据进行每个 JS 函数的压缩和解压 会增加多少延迟 我正在使用这个 js
  • 谷歌地图API v3如何获取所有形状的坐标

    我有这个谷歌脚本 可以创建形状和删除形状 但没有太多关于保存形状的信息 我查了一下互联网 知道我可以通过 overlaycomplete 中的 getpaths 访问路径坐标 而且我还可以将坐标推入一个收集所有形状的数组中 但是 如果用户删
  • 为什么 "asdf".replace(/.*/g, "x") == "xx" ?

    我偶然发现了一个令人惊讶的 对我来说 事实 console log asdf replace g x Why two替代品 似乎任何没有换行符的非空字符串都会产生此模式的两个替换 使用替换函数 我可以看到第一个替换是整个字符串 第二个替换是
  • Node.js 连接 createServer 代码

    我正在阅读 Node js Connect 版本 2 15 0 Create a new connect server return Function api public function createServer function ap
  • 带有子节点的拖放区域

    我有一个带有多个子节点的拖放区域 主要元素有dropenter and dropleave事件 但是 如果您将文件拖动到主元素内部和子节点上方 则dropleave被触发 如何处理 以便dropleave仅当拖动的元素和鼠标位于主元素之外时
  • JavaScript 匿名函数语法

    下面两个块有什么区别 block 1 console log anonymous block block 2 function anon console log anonymous block 2 我在 Netbeans 中运行了这个 使用
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • 路由和干净路径(无主题标签)在 angularJS 中不起作用

    伙计们 这让我发疯了 我为此奋斗了几个小时 却找不到解决方案 我知道为了从 URL 路径中清除主题标签 我需要使用 locationProvider html5Mode true 但由于某种原因 这对我来说效果不佳 我使用 tomcat 7
  • “WebSocket 在连接建立之前已关闭”是什么意思?

    我正在使用 JavaScript 和联盟平台 http www unionplatform com我该如何诊断这个问题 非常感谢 如果你去http jsbin com ekusep 6 edit http jsbin com ekusep
  • 使用js获取选择选项的onclick事件

    我有一个非常令人沮丧的问题 我有这个代码 它过滤掉我的结果并将它们输入到选择框中 var syn
  • 在 Javascript 中动态创建 []array

    也许这将是一个真正愚蠢的问题 但我是 JavaScript 新手 并且坚持动态创建数组 如下格式 items Date 2012 01 21T23 45 10 280Z Value 7 Date 2012 01 26T23 45 10 28
  • AngularJS 应用程序:如何将 .js 文件包含到 index.html 中

    我是 angularJS 的新手 我设法使用 AngularJS 构建了一个phonegap应用程序 该应用程序正常并且运行良好 问题是 现在我对 angularJS 的工作原理有了更多的了解 至少我认为我已经了解了 我担心我的应用程序文件

随机推荐

  • android/eclipse 中的网络服务

    我需要通过soap 方法使用android eclipse 的Web 服务 即 我必须提供输入并根据用户输入从网络服务显示适当的结果 如何做到这一点 java类 public class Demo webserviceActivity ex
  • 如何从我的网站发送电子邮件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在一个网站上工作 我是这个领域的新手 我已经制作了一个网站 但我在 联系我们 表单中遇到了问题 在这种形式中 我制作了四个文本框
  • 基于网络的颠覆查看器[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • p:对话框没有按预期工作?

    我有两个 p commandLink
  • 命名空间“System.Runtime”中不存在类型或命名空间名称“Caching”

    我知道通常有一个简单的解决方案 即在添加引用中引用 dll 但我已经添加了引用 并且 system runtime caching 出现在我的引用列表中 但错误仍然显示 该错误在运行时显示在浏览器中 因此可以编译 我已删除并重新添加了引用
  • 解压以 ASCIIZ 字符串结尾的结构

    我正在尝试使用struct unpack 分解以 ASCII 字符串结尾的数据记录 该记录 恰好是 TomTom ov2 记录 具有以下格式 存储为小端 1 byte 4 字节 int 表示总记录大小 包括该字段 4字节整数 4字节整数 可
  • Webdriver 在 Gmail 中打开邮件

    我已经开始使用 Webdriver 来自动化我们的测试 这是 100 手动的 在其中一个用例中 我需要单击发送到用户收件箱的链接 在这种情况下 我遇到了 Gmail 问题 登录后我无法弄清楚如何打开特定电子邮件 我知道电子邮件主题等 但我无
  • C# 位移位:这种行为是规范中的行为、错误还是偶然?

    我正在使用位移运算符 请参阅我的问题位数组相等 https stackoverflow com questions 2320754 bit array equality 并且一位 SO 用户指出了我计算移位操作数时的一个错误 我正在计算 i
  • 使用 Gradle 检测 IDE 环境

    无论如何 有没有办法检测我正在运行我的项目的环境 像这样的事情 构建 gradle def usingIntelliJ def usingAndroidStudio if usingIntelliJ buildConfigField Str
  • 简单的 preg_replace 返回 null

    为什么这个非常简单的 preg replace 返回 null preg replace s test test 这个想法是删除空格 您忘记添加分隔符 preg replace s test test 而且最好使用 s 代替 s 在你的模式
  • 由于内容不可压缩,谷歌浏览器中出现了新的复合层

    当 chrome profiler 说 图层是单独合成的 因为它无法被挤压 时 它到底意味着什么 我正在对我的 html 进行更改 并在相对 div 内引入了一个固定位置 div 并给出了will change transform在上面 完
  • 使用 wget 从 Google Scholar 搜索结果下载所有 pdf 文件

    我想写一个简单的网络蜘蛛或者只是使用wget从谷歌学术下载 pdf 结果 这实际上是获取研究论文的一种非常巧妙的方式 我已阅读 stackoverflow 上的以下页面 使用wget爬取网站并限制爬取链接总数 https stackover
  • 为什么 dagger 被认为比 Guice 更适合 AWS lambda 实现?

    我知道 dagger 通过生成代码在编译时创建注入 因此它的性能比 Guice 更好 Guice 在运行时执行注入 但特别是对于 lambda 的情况 我看到在多个地方都提到 Dagger 是首选 是因为冷启动问题吗 由于lambda的冷启
  • 浏览器特定的 CSS 属性

    在哪里可以找到完整的 浏览器特定 css 属性 参考 我的意思是一些属性 例如 moz border radius这仅适用于 Firefox 或 webkit min device pixel ratio 这些示例仅适用于指定的 Web 浏
  • Python3 venv:env目录可以重命名吗?

    我在 Windows 上使用 Python 3 4 我创建了一个虚拟环境 python c Python34 Tools Scripts pyvenv py foo 然后激活它 foo 脚本 activate bat 并在其中安装了几个库
  • 大负整数文字

    在 Visual Studio 2010 上执行以下程序 include
  • 将文件夹中的多个 csv 文件读取到 R 中的单个数据帧中[重复]

    这个问题在这里已经有答案了 我有一个包含 332 个 csv 文件的文件夹 文件名称如下 001 csv 002 csv 003 csv 330 csv 331 csv 332 csv 所有文件都具有相同数量的变量和相同的格式 我需要读取一
  • “您是否缺少 using 指令或程序集引用?”我是还是不是?

    多次清理和重建所有内容 重新启动 VS 和计算机 但没有任何进展 在修补 QueryCommander 开源项目中的一些错误时 我遇到了 Debug 构建但 Release 不构建的问题 我收到这个错误仅在发布模式下 CS0246 The
  • 距数据帧中最近的非 NA 值的距离

    我有以下数据帧 df 我想添加一列 其中包含与每行最接近的非 NA 值的距离 df lt data frame x 1 20 df c 1 3 4 5 11 14 15 16 x lt NA 换句话说 我正在寻找以下值 df distanc
  • 为什么 `obj.foo = function() { };` 没有将名称 `foo` 分配给函数?

    从 ES2015 ES6 开始 函数有了专有名称 包括官方名称 name属性 而函数创建时的赋值除了明显的函数声明和命名函数表达式之外还有多种方式 比如给变量赋值 函数的名字设置为变量的名字 给对象属性赋值 函数的名称设置为属性的名称 甚至