为什么 JavaScript 中的匿名函数有名字?

2023-11-23

我正在读一本很棒的书,名为《JavaScript Ninja 的秘密》,作者是 John Resig 和 Bear Bibeaoult。 3.2章中给出了一个例子;

var canFly = function(){ return true; };

然后它说;

创建一个匿名函数并将其分配给名为 canFly 的全局变量。由于 JavaScript 的函数性质,可以通过此引用调用该函数,如 canFly()。在这方面,它在功能上几乎等同于声明一个名为“canFly”的命名函数,但又不完全一样。一个主要区别是函数的名称属性是“”,而不是“canFly”。

但是当我尝试在 Chrome 的开发人员工具上执行示例并检查name的财产canFly函数时,它返回值“canFly”而不是空字符串。

canFly.name;
// > "canFly"

早期分配给变量的匿名函数没有名字吗?如果是这样,发生了什么变化?还是作者犯了错误?


理论上匿名函数是匿名的,意思是无名的。这就是它最初的实施方式,十多年来,每个人都对此表示满意。

然后发生了两件事:整个 Web2.0/ajax 运动,人们开始在网页和 Node.js 中实现桌面应用程序中常见的 UI 功能。这两者的结合迫使越来越多的开发人员将 javascript 视为一种严肃的语言,一旦人们熟悉了 javascript,他们就开始编写非常大的代码库。

这导致了人们对 javascript 的可调试性的抱怨。从没有任何有用的调试器(这导致我们在浏览器中拥有非常好的调试器,在我看来,仅次于 MS Visual Studio)到不知道 console.log 来自什么函数(因为它们是匿名的),有很多问题。 。

这导致浏览器和 js 引擎开发人员实现试图猜测无名函数“名称”的代码。

从理论上讲,此功能是错误的,因为您不能总是保证您猜测的名称就是函数的调用方式(例如,如果函数被分配给多个不同的变量)。在实践中,90% 的情况下都有效的东西总比什么都没有好。

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

为什么 JavaScript 中的匿名函数有名字? 的相关文章

随机推荐

  • Hadoop Yarn:如何使用 Spark 限制资源的动态自分配?

    在我们在 Yarn 下运行的 Hadoop 集群中 我们遇到了一个问题 一些 聪明 的人能够通过在 pySpark Jupyter 笔记本中配置 Spark 作业来消耗更大的资源块 例如 conf SparkConf setAppName
  • 为什么 TypedReference 是在幕后?它是如此快速和安全......几乎是神奇的!

    警告 这个问题有点异端 宗教程序员总是遵守良好的实践 请不要阅读它 有谁知道为什么使用类型化参考如此沮丧 隐含地 由于缺乏文档 我发现它有很大的用途 例如当通过不应该是泛型的函数传递泛型参数时 当使用object如果您需要值类型 则可能会过
  • 将 LINQ-to-SQL 谓词组合成单个谓词

    之前的一个问题 递归地 将 LINQ 谓词组合成单个谓词 与此类似 但我实际上问了错误的问题 那里的解决方案满足了所提出的问题 但实际上并不是我需要的 但它们是不同的 诚实的 给定以下搜索文本 keyword1 keyword2 keywo
  • 将行旋转为列 Firebird 2.5

    序列 table1 id Description 1 Proj x 2 Settlers 3 Bank 4 Newiest table2 id table1Id value alternate value 1 1 12 null 1 4 6
  • 从您的网站中删除 WWW 前缀

    当作为 URL 的一部分输入 www 前缀时 Stack Overflow 和其他网站 如何删除它 是重定向 重写还是其他什么 更新 我特别想知道 IIS 6 的上下文 在 Apache 上 它看起来像这样 在 htaccess 文件内 R
  • 在三星 Galaxy 设备上同时访问前置和后置摄像头

    我知道这个问题以前曾被问过 但已经过去很长时间了 再次问这个问题是为了收集任何新的技巧 想法 方法 我需要同时访问前置摄像头和后置摄像头 到目前为止 我已经尝试使用 android 相机 API 实现 双摄像头 Jens 设计 和camer
  • 高级比较和交换 (CAS) 功能?

    我想记录哪些高级 即 C 不是内联汇编器 函数或宏可用于比较和交换 CAS 原子原语 例如 x86 上的 WIN32 有一系列函数 InterlockedCompareExchange in the lt intrin h gt heade
  • Elastic Beanstalk 自定义 AMI 看不到环境变量

    由于一些大型软件包的要求 我正在为 Elastic Beanstalk 使用自定义 AMI 当我通过 SSH 访问 EC2 实例时 我的应用程序无法使用任何环境变量 在 Elastic Beanstalk Web 控制台设置中指定 我在生产
  • 获取异步方法主体中的当前任务实例

    如果我有一个像这样的异步方法体 public async Task GetSomething await SendText hi await SendImage bla bmp 当等待开始时 如何在将任务对象返回给用户之前获取任务对象 ie
  • React Fontawesome 没有 free-brands-svg-icons,因此无法显示社交媒体图标

    我可以在 React 网页上使用社交媒体图标吗 import library from fortawesome fontawesome svg core import FontAwesomeIcon from fortawesome rea
  • 悬停在另一个元素上时隐藏元素

    我知道可以在JavaScript 但是我正在寻找解决方案CSS 我有三个div div hide 默认应该是可见的 show 应该是隐藏的 当我将鼠标悬停在 main 上时 hide 应该隐藏 show 应该可见 div show 工作正常
  • 是否有浏览器支持输入元素的 form 属性?

    HTML5 规范允许与形式相关的元素参考他们的联系
  • Spring Boot应用程序启动后立即关闭

    我目前正在开发一个包含 Spring 框架的项目 一切都按方面进行 但有一个问题 当我尝试在笔记本电脑上启动应用程序时 它在启动后立即关闭 它在其他所有机器上都可以工作 所以这个问题只发生在我的笔记本电脑上 也许您知道什么会导致这个问题 我
  • 如何重新安装已安装的 Eclipse 插件?

    如何将 Eclipse 插件从一个 Eclipse 安装 删除 或 复制 到另一个安装 例如 我安装了两个 eclipse 其中一个安装了一个插件 但我没有安装程序 也不容易在线获得 是否可以在我的其他版本的 eclipse 上安装此插件
  • 在浏览器中显示word/pdf/excel等文件。 (ASP.NET、C#.NET 2008)

    我有一个需要在浏览器中显示 Pdf Word 文档 任何版本 或 Excel 的要求 类似于GMAIL的功能 我怎样才能实现这个目标 我正在使用 Asp net 代码隐藏为 C 申请时间是2008年 Try 如何使用 ASP NET 和 V
  • 如何在使用相对 URL 时更改 http/https 协议

    协议相关 URLaren t我在寻找什么 我正在寻找一种绝对指定协议 http 与 https 同时保持 url 相对主机名的方法 给定一个相对 URL 例如 SearchForStuff 我希望能够指定不同的协议 https 与 http
  • 如何在 Linux 上使用 GCC 编译 C 和 Gtk+?

    我搜索了又搜索 但没有得到我真正想要的信息 有人可以尽可能完整地 从根本上解释一下在 Linux 上使用 GCC 用 C 语言编写时 Gtk 代码是如何编译的吗 有些东西像反引号 c99 和 o 文件我根本不理解 我也非常感谢任何学习 Gt
  • RealityKit - 为 ModelEntity 的不透明度设置动画?

    通过设置材质的颜色model的财产ModelEntity 我可以改变对象的不透明度 alpha 但如何将其动画化呢 我的目标是使对象具有完全不透明度的动画 然后让它们淡入设定的不透明度 例如 50 With SCNAction fadeOp
  • R 中 igraph 网络的输出 shapefile

    你好 我在 R 中有一个使用 igraph 库的网络 Vertices 616 Edges 6270 Directed TRUE No graph attributes Vertex attributes name Lat Lon Edge
  • 为什么 JavaScript 中的匿名函数有名字?

    我正在读一本很棒的书 名为 JavaScript Ninja 的秘密 作者是 John Resig 和 Bear Bibeaoult 3 2章中给出了一个例子 var canFly function return true 然后它说 创建一