JavaScript 中的匿名函数命名有何不同?

2024-02-05

我正在分析 John Resig 网站上的以下两个 url,但我不明白为匿名函数命名有何不同。

我的理解是,赋予匿名函数的名称只能在函数定义内部使用,而不能在函数定义之外使用,但在以下链接中它会产生巨大的差异

  • http://ejohn.org/apps/learn/#13 http://ejohn.org/apps/learn/#13
  • http://ejohn.org/apps/learn/#14 http://ejohn.org/apps/learn/#14

任何解释或参考都会有很大的帮助。

我仍然对 #14 中的以下几行感到困惑

var samurai = { yell: ninja.yell }; 
var ninja = {};
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." ); 

当 ninja 现在指向一个空白对象时,Samurai.yell 方法如何仍然能够指向 ninja.yell。

#13 和 #14 之间的唯一区别是为 #14 中的函数表达式提供名称。

ninja.yell 是否被复制到 yell 且未被引用,或者这些 NAMED 函数表达式在某些情况下具有全局作用域,如下所示?

同样的事情发生在 #13 和 #14 中,唯一的区别是函数在 #14 中被命名,而在 #13 中未命名,加上 #14 中的 ninja = {} 和 #13 中的 ninja = null。我是否遗漏了有关命名函数表达式的任何隐藏概念,这使得#14 可行而#13 不可行。


在内部示例中,您可以跳过 #13 中对 ninja 对象的额外访问

匿名闭包(访问对象ninja尽管我们已经处于这种情况,但仍然需要):

var ninja = { 
  yell: function(n){ 
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
  } 
};

命名闭包可以直接调用:

var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
};

另一个优点是命名闭包支持堆栈跟踪:

所以假设你这样做:

(function fooBar() { console.log(brazl); })();
// will create an error with "fooBar" in the stack trace instead of "anonymous function"

编辑:虽然它可能看起来像是开销,但有时它有助于在开发过程中进行调试,例如 YUICompressor 和 Closure Compiler 可以删除这些名称(如果本质上不需要)

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

JavaScript 中的匿名函数命名有何不同? 的相关文章

  • 单独的数据间隔 bootstrap 轮播 4

    我想为 Bootstrap 4 轮播上的每张幻灯片设置单独的数据间隔 我尝试了一些其他的 javascript 片段 但是它们似乎不适用于我的代码 例如Bootstrap 4 轮播堆栈溢出 https stackoverflow com q
  • 在 userCodeAppPanel 中看不到我的 javascript 代码

    这是来自 Google 电子表格中包含的脚本的代码 唯一的其他代码是onOpen它创建菜单和showDialog 功能 function showDialog userInterface HtmlService createHtmlOutp
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • 刷新页面后保留输入值

    我有一个带有输入字段的表单 该输入包含一个下拉菜单 从数据库中读取信息 如果用户输入值 并且当他到达下拉菜单时 他没有找到他想要的内容 他会转到另一个页面将此信息添加到下拉菜单 然后转到第一页继续输入信息 如果他转到另一个页面向下拉菜单添加
  • 我可以用一个简单的函数制作一个迭代器吗? (没有生成器或 Symbol.iterator)

    我一直在尝试使用普通函数创建一个迭代器 而不使用生成器或使用Symbol iterator用于学术目的的协议 为此 我创建了一个函数 它返回一个带有next参数 但尝试将其作为iterable的论证for of循环会产生不需要的结果 这是到
  • 从 ES6 模块导入函数表达式或函数声明有什么区别?

    据我了解 参见第 16 3 2 1 节 http exploringjs com es6 ch modules html ES6 允许函数 类导出操作数使用不同的语法 区别在于导出的函数是否需要在导入时解释为函数声明 在这种情况下 您可以编
  • “move(-1)”作为 AngularJS 表达式有什么问题吗?

    我收到此错误 parse ueoe Unexpected end of expression move 从这段代码来看
  • 使用 jquery 更改锚文本和图标

    我有一个隐藏或显示 div 的锚标记 但我无法更改它的文本和图标 如何更改文本和图标标签 因为目前它将图标标签解析为常规文本 锚标记 a class collapse info btn i class icon arrow up icon
  • Moment.js 动态更新时间(以秒为单位)

    我试图显示时钟 that 每秒更新一次 e g 2015 年 1 月 5 日 12 05 01 它似乎对我来说工作得很好 对于相同的代码 并且只有 moment min js 指向v2 11 0 看看代码 来源 MilkyWayJoe va
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • JavaScript/jQuery - “$ 未定义 - $function()”错误

    我正在尝试运行 JavaScript jQuery 函数并且Firebug http en wikipedia org wiki Firebug 28software 29得到错误 is not defined function JavaS
  • Flask 和 Reactjs 抛出 JSX 转换错误

    我已经开始将 ReactJS 与 Python Flask 后端结合使用 通过 Flask 渲染模板时 我在 Chrome 控制台中收到以下客户端错误 错误 找不到模块 jstransform visitors es6 templates
  • 如何处理 setTimeout() 的多个实例?

    阻止创建 setTimeout 函数的多个实例 在 JavaScript 中 的最推荐 最佳方法是什么 一个例子 伪代码 function mouseClick moveDiv div 0001 mouseX mouseY function
  • FullCalendar:如何重新创建/重新初始化 FullCalendar 或批量添加多个事件

    我正在尝试将新事件批量添加到日历中 但未能找到方便的使用方法 所以我决定用新的事件数组重新初始化视图 所以我尝试了以下方法 var events title Event start new Date y m d 10 description
  • 除非打开开发人员工具,否则 IE8 Javascript 无法运行?

    由于某种原因 在 IE8 中 除非我在打开开发工具的情况下重新加载页面 否则 javascript 不会运行 我关闭开发人员工具并重新加载页面 然后 javascript 停止工作 我没有收到任何错误报告 无论如何它们也没有任何用处 还有其
  • 检测 html 选择框上的编程更改

    有没有办法让 HTML 选择元素在每次以编程方式更改其选择时调用函数 当使用 JavaScript 修改选择框中的当前选择时 IE 和 FF 都不会触发 onchange 此外 更改选择的 js 函数是框架的一部分 因此我无法更改它以在结束
  • javascript 闭包和对象引用

    我的情况有点晦涩难懂 主要是因为我认为我已经掌握了闭包 所以基本上我想要的是将集合重置为默认值 假设我有一个集合 它具有带有对象参数数组的构造函数 var c new collection x y z 然后集合定期更新 因为我没有保留数组的
  • 如何更改数据表中标题单元格的内容?

    我正在使用数据表 http datatables net plugin 在我的可排序列上 我想用按钮替换列文本 但是这样做 oSettings aoColumns i nTh text 我可以检索相应列的文本 但是 oSettings ao
  • 引导网格中的绘图图周围有巨大的空白

    我有一个 Net 应用程序 我试图在其中使用创建一个图表bootstrap js and plotly js 当我创建响应式图表时 我遇到网格中存在巨大空白的问题 我发现问题的一部分是plotly svg container的大小默认高度为
  • 使用 javascript 从亚马逊 URL 中抓取 ASIN

    假设我有一个像这样的亚马逊产品 URL http www amazon com Kindle Wireless Reading Display Generation dp B0015T963C ref amb link 86123711 2

随机推荐

  • 如何让 Google Now 在 Android 后台持续运行

    我心里有一个应用程序的想法 但我还没有弄清楚其中的一部分 在 Android 版 Google Now 中 它为您提供以下搜索选项 输入搜索 点击麦克风说出您的搜索 或者只需说 Google 即可开始语音搜索 我想知道他们是如何让 3 发挥
  • 获取 Yii 中最后插入的值

    我已经制作了一个表单模型 其中的字段就像 id firstname lastname description created at updated at created by updated by 我已经为表单做了必要的 CRUD 现在我想
  • JMeter 基本身份验证

    我试图暗示使用 JMeter 的 Web 服务的基本身份验证过程 但每次它都会抛出错误 401 Unauthorized 我尝试使用 HTTP 标头管理器向其添加标头授权和值 但它仍然不起作用 我还尝试过使用 HTTP 授权管理器 还是没有
  • 将组合框值传递到 MS Access 中的 SQL 查询

    我的表单中有一个组合框 我希望将组合框的文本传递到查询中 我的查询是 select from where something Forms Enter Data comboCup 表格的名称是Enter Data组合框的名称是comboCup
  • python中[None]和[]有什么区别? [复制]

    这个问题在这里已经有答案了 我认为 None 与 相同 但在我的测试中 也许有一些东西 gt gt gt print len 0 gt gt gt print len None 1 我什么时候应该使用 None 和 另一个有趣的问题 gt
  • Visual Studio 2013.3 中新的 MVC5 项目出现错误

    想知道其他人是否经历过这种情况以及他们的解决方案是什么 在 Visual Studio 2013 中 我创建一个新的 ASP NET Web 应用程序 保留所有默认值 在下一个屏幕中 我选择 MVC 添加 MVC 的文件夹和核心引用 但不添
  • Scrum - 您何时估计产品待办事项的工作量? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您的团队在 Scrum 流程的哪一部分对完成给定产品积压项目所需的工作量进行了有根据的估计 例如 假设您有一个产品待办事项列表项 内容为 Sprint
  • xCode 中存在重复符号,但不存在重复符号

    问题Xcode 版本 4 6 1 4H512 抱怨重复符号问题 重复符号 OBJC METACLASS PacksStoreHelper 位于 Users shannoga Library Developer Xcode DerivedDa
  • 如何在 flutter 中使用展示案例视图?

    I use 展示案例查看 https github com simformsolutions flutter showcaseview打包在我的应用程序中 并想展示一次 就在第一次启动之后 我怎样才能只执行一次而不在下次启动时显示它 ove
  • MapViewOfFile 返回什么? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么加载程序无法加载到所需位置 https stackoverflow com questions 9698496 why wont the loader load at the desired l
  • 为什么当列包含空字符串时bcp输出null,当列包含空字符串时bcp输出空字符串?

    这让我觉得非常奇怪的行为 在发现这个之前我花了一段时间检查代码中的错误 out 从数据库表或视图复制到文件 如果指定现有文件 则该文件将被覆盖 提取数据时 请注意 bcp 实用程序将空字符串表示为 null 将 null 字符串表示为空字符
  • Excel 搜索包含子字符串的多行

    我有一个包含 2 张纸的 Excel 文件 第一个获得了列中的关键字列表 第二个在一个列上有句子 在另一列上有一个 id 因此 这两张纸看起来像这样 Sheet 1 Sheet 2 A A B the 15587 The cat is wa
  • Gomock无法使用类型map[string]*mockFoo作为map[string]foo

    我正在使用 gomock 并且我有一段希望测试的示例代码 type StructA struct client map string Foo type Foo interface foo methodFoo string func a st
  • 如何从 S3 存储桶中递归删除文件

    我在 S3 中有以下文件夹结构 有没有办法递归删除某个文件夹下的所有文件 比如foo bar1 or foo or foo bar2 1 foo bar1 1 foo bar1 2 foo bar1 3 foo bar2 1 foo bar
  • OnsenUi Angular 和登录

    我正在尝试使用 onsen cordova 开发移动应用程序 我需要的是 当应用程序启动时 它会加载login html页面 如果应用程序检测到用户已登录 则会重定向到 home html 对于每个 受保护的页面 我想调用一个检测用户是否已
  • Mac 版 Java 中的文件输入

    我们现在正在编程课上学习文件输入和输出 但我有一台 Macbook Pro 我了解如何执行此操作 并且可以在 Windows 上执行此操作 但我无法找到如何在 Mac 上执行此操作 我只是似乎不知道在 File Fred new File
  • 如何从 Java 调用 .NET 代码?

    我并不是在寻找像网络服务这样的常见答案 我正在寻找在同一台机器上运行的轻型解决方案 编辑 我正在寻找 Java 中调用 NET 方法的方法 我是作者jni4net http jni4net sf net JVM和CLR之间的开源进程间桥梁
  • 将 AppCompat 主题应用于 PreferenceFragment 中的个人首选项

    我一直在努力争取我的PreferenceFragment与我的应用程序的其余部分具有相同的基于材质的主题和样式 通过 AppCompat 这PreferenceFragment我用来管理所有应用程序设置的工具如下所示 正如您从上面的屏幕截图
  • 如何在布局中包含布局?

    如何在Android布局中包含布局 我正在创建通用布局 我想将该布局包含在另一个页面中 Edit 正如评论中正确要求的更多信息 使用include tag
  • JavaScript 中的匿名函数命名有何不同?

    我正在分析 John Resig 网站上的以下两个 url 但我不明白为匿名函数命名有何不同 我的理解是 赋予匿名函数的名称只能在函数定义内部使用 而不能在函数定义之外使用 但在以下链接中它会产生巨大的差异 http ejohn org a