为什么我可以在 JavaScript 中定义函数之前使用该函数?

2024-01-16

即使在不同的浏览器中,此代码也始终有效:

function fooCheck() {
  alert(internalFoo()); // We are using internalFoo() here...

  return internalFoo(); // And here, even though it has not been defined...

  function internalFoo() { return true; } //...until here!
}

fooCheck();

不过,我找不到任何关于它为何有效的参考资料。 我第一次在 John Resig 的演讲笔记中看到这一点,但只是提到了。那里或任何地方都没有对此问题的解释。

有人可以启发我吗?


The function声明是神奇的,它会导致其标识符在执行其代码块*中的任何内容之前被绑定。

这与带有function表达式,按正常的自上而下顺序计算。

如果您将示例更改为:

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

它会停止工作。

函数声明在语法上与函数表达式完全分开,尽管它们看起来几乎相同并且在某些情况下可能不明确。

这记录在ECMAScript标准 https://www.ecma-international.org/publications/standards/Ecma-262.htm, 部分10.1.3。不幸的是,即使按照标准,ECMA-262 也不是一个非常可读的文档!

*:包含函数、块、模块或脚本。

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

为什么我可以在 JavaScript 中定义函数之前使用该函数? 的相关文章

  • Canvas drawImage 内联 svg 在 Firefox 上不起作用

    这是一个例子 它采用 svg 并将其转换为画布 http jsfiddle net Na6X5 944 http jsfiddle net Na6X5 944 var can document getElementById canvas1
  • 将浮点值转换为灰度十六进制颜色值

    这个问题又快又简单 我有一个二维浮点数组 0 0000000 到 1 0000000 我想将这些数字转换为颜色值 000000 到 ffffff 请注意 我所说的只是灰度值 0 黑色 0 5 中灰色 1 白色 有谁知道如何用 javascr
  • 旋转嵌套 SVG

    我在用SVG js http svgjs com并尝试使用 SVG 进行一些操作 我以前使用过 canvas 但我对其生成的图像质量非常失望 因此我决定使用纯 SVG 我设法将所有内容都改为纯 SVG 方法 除了一件事 旋转 我无法让它发挥
  • Xhr上传event.loaded问题

    opts xhr function var xhr new window XMLHttpRequest Upload progress xhr upload onprogress function e if e lengthComputab
  • jQuery Mobile:$(...).listview 不是函数

    我正在尝试在 UL 中动态插入 LI 元素后刷新 jQuery Mobile 中的列表视图 每当我尝试 myUL listview refresh 在控制台上我收到错误 未捕获的类型错误 listview 不是函数 我该如何解决这个问题 确
  • Scalatest PlusPlay Selenium 无法调整窗口大小

    对此已经研究了一段时间 我似乎找不到使用 scalatest plus 调整窗口大小的方法 我发现在线搜索或文档的唯一方法http doc scalatest org 2 1 5 index html org scalatest selen
  • 在 PHP 中合并文件块

    出于教育目的 我想创建文件块上传 你们怎么知道所有块何时上传 我试图从temp并重命名它们 使它们按正确的顺序排列 然后与最后一个块将它们合并在一起 然而 我猜最后发送的并不是最后收到的 所以fopen on chunks 失败 因为它们尚
  • 无法获取子 DOM 元素

    注 由于问题有点复杂 为了可读性对代码进行了抽象 We ve a
  • Elasticsearch 前缀匹配消失且未添加 (QueryString)

    结转自Elasticsearch QueryStrings 部分匹配 NOT 查询 https stackoverflow com questions 40100006 elasticsearch querystrings partiall
  • 过滤文件上传仅用于文本文件

    我使用的是 Firefox 版本 14 0 1 我需要过滤上传文件窗口以仅显示 txt files 我的浏览器不仅仅支持文本文件 text plain 我可以通过指定此格式来限制图像文件 image 但我只需要过滤文本文件在文件选择器窗口中
  • 如何让 jQuery 选择带有 . (句号)在他们的身份证件中?

    给定以下类和控制器操作方法 public School public Int32 ID get set publig String Name get set public Address Address get set public cla
  • IE7 真的不支持indexOf javascript 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 数组上的 indexOf 函数在使用 JavaScript 的 IE7 8 中不起作用 https stackoverflow com questions 11544983 indexof funct
  • 如何对基于 HTML5-JavaScript 的视频播放器进行快照?

    实际上 我有一个带有 JavaScript 函数的 HTML5 页面 可以让我播放 wmv 视频文件 我需要在视频播放时 有暂停或没有暂停 拍摄快照并以任何图像格式 JPG 或 BMP 保存 任何帮助将不胜感激 谢谢
  • 在单页应用程序上重用 Google Maps API 实例

    假设我有一个单页应用程序 Angular JS 应用程序 并且我在元素 id 上绘制一个 Google 地图实例googleMap var mapInstance new google maps Map document getElemen
  • 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

    我正在使用 Angular 7 2 当我进入ng serve 我面临以下问题 致命错误 接近堆限制的无效标记压缩分配失败 JavaScript 堆内存不足 这意味着什么 我该如何解决这个问题 完整的错误消息是 FATAL ERROR Ine
  • JSON.stringify 对于大型对象来说非常慢

    我在 javascript 中有一个非常大的对象 大约 10MB 当我对其进行字符串化时 需要很长时间 因此我将其发送到后端并将其解析为一个对象 实际上是带有数组的嵌套对象 这也需要很长时间 但这不是我们在这个问题中的问题 问题 我怎样才能
  • ajaxStart 和 ajaxStop 与 fetch API 等效

    我正在尝试将 API 调用从使用 jQuery ajax 迁移到使用 Fetch API 我使用 jQuery ajaxStart 和 ajaxStop 在服务器调用期间显示加载旋转器 我正在运行多个并行服务器请求 我希望旋转器在第一个请求
  • 嵌套对象的 setState

    我有一个嵌套对象作为状态 并且在组件中有一个表单 我正在考虑每次用户在表单中输入某些内容时更新状态 并且为了避免为每个输入创建许多函数 我正在考虑使用 switch 创建单个函数 使用 switch 创建单一函数是个好主意吗 如何更新对象的
  • 在 JSON 对象中存储和发送原始文件数据

    我正在寻找一种方法来传输任何文件类型的原始文件数据和任何可能的内容 我的意思是文件和文件内容都是用户生成的 在 Backbone 前端中使用 xhr ajax 调用两种方式针对 Django 后端 编辑 也许问题仍然不清楚 如果您在 IDE
  • localStorage 获取 NULL?

    我不知道为什么 因为我之前已经这样做过并且工作正常 我认为这可能是因为浏览器问题 错误 localStorage setItem foo bar alert localStorage getItem foo 我使用的是 Firefox 3

随机推荐

  • Ansible 带有堡垒主机/跳线盒? [复制]

    这个问题在这里已经有答案了 我相当确定我在 ansible 文档中看到了一个功能 您可以告诉它要连接到某些主机 它首先需要通过 DMZ 主机建立隧道 然而 除了邮件列表上的一些辩论之外 我似乎找不到任何文档 我知道可以使用 ssh 配置来破
  • 编辑 ArrayList 中对象的变量?

    public void setPunt int index if index gt 0 index lt PuntenLijst size x 3 y 5 我在名为 PuntenLijst 的数组列表中有一个对象实例数组 通过此方法 我想使
  • 使用 prolog 显示布尔逻辑失败的原因

    假设我有以下布尔逻辑 Z A or B and A or C 是否可以使用序言 可能与某些库一起 来找出 Z 为假的原因并以以下格式返回答案 Z 为假 因为 A 或 b 和 c 为假 如果我替代some已知值 或全部 例如 c true 它
  • 使用 git 子模块时 NuGet 自动包恢复

    我试图了解在引用 Github 上托管的库时是否有任何方法可以依赖 Nuget 自动包还原 问题是 当我添加某些库作为子模块时 它有自己的 packages 目录 但是 当我将该库中的 csproj 添加到我的解决方案中时 由于该子模块的
  • 子类化 UIView 时如何检测箭头键?

    基本上 我想在按下其中一个箭头键时执行某些操作 我读过很多不同的问题 他们中的很多人都在谈论keyDown 但那是为了NSViewController or NSWindow this https stackoverflow com que
  • Pact Dsl - 提供商返回的记录多于 Pact 文件中的记录

    我有以下课程 public class Student private String id private String firstName private String lastName private int age public cl
  • Paper.js 无法正确调整画布大小

    我正在尝试Paper js http paperjs org 为了好玩 但似乎我已经在一开始就陷入困境 Adding resize true to the canvas标签应该使元素与浏览器窗口一样高和宽 然而 这样做会导致一些相当奇怪的行
  • 我如何在 Eclipse 中调试 openerp 代码 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我怎样才能在 eclipse 中调试
  • 使用 IoC 在 SOA 应用程序中通过 DDD 进行验证

    在我的服务外观层中 我有一个服务类 其方法 操作接受 DTO 数据契约 对象 AutoMapper 用于将此 DTO 映射到我的域对象的实例以应用任何更改 该请求被传递到我的域服务 该服务执行实际工作 该方法可能如下所示 public En
  • 如何在 Angular 2 中使用 FullCalendar

    我对 Angular 2 相当陌生 正在尝试掌握如何将 Angular 2 与现有的 Javascript UI 框架库集成 现在我正在尝试使用 jQuery 插件http fullcalendar io http fullcalendar
  • 投影深度的法线

    我想计算法线贴图N i j 从深度图D i j where i j 描述 2D 像素位置 这里讨论这个问题的基本情况 使用相邻像素叉积从深度图像计算表面法线 https stackoverflow com questions 3464410
  • MVC @Url.Content 与 @Url.Action

    我在网上查过但无法找到两者之间的区别 使用 Url Content vs Url Action Url Content当您希望解析站点上任何文件或资源的 URL 并且将相对路径传递给它时使用 Url Content path file ht
  • 两个相同的 URL,但参数顺序不同:内容重复?

    我自己的 CMS 会自动向页面中的链接添加新参数以指定给定语言 它工作得很好 但它并不总是将 var 放在相同的位置 给我一个指向相同页面 语言的链接 www xxx yy index php mod blog page 3 lang en
  • Android WebView如何处理数据?

    Android的WebView可以使用本地存储 Service Workers IndexedDB和许多其他功能 但是 我无法找到有关此数据存储位置以及何时清除的任何信息 通过一些测试 我已经能够确定它们没有存储在缓存中 因为我可以删除缓存
  • CSS 仅适用于 IE 8

    我需要为某些项目设置仅适用于 IE 8 的样式 如果我这样做 然后我这样做 会发生什么 我找到了这个链接到之前的SO问题 https stackoverflow com questions 3958913 fix css if lt ie
  • LINQ to Entities 无法识别 ElementAt 方法

    我正在使用该方法Queryable ElementAt Int32 获取查询结果的特定元素 IQueryable
  • Android ListView下拉刷新

    是否有像 iOS 中那样存在的默认功能来更新列表视图 或者任何其他图书馆 现在支持库支持此功能并称为swipeRefreshLayout https developer android com reference android suppo
  • React-native:动态更新堆栈导航器中的标题标题

    我为标题标题 堆栈导航器 制作了一个自定义组件 它显示用户名以及一些图像 在此页面上我必须编辑用户名并成功也在标题中更新它 所以我的问题是如何动态更改 更新标题 这可以使用导航道具来完成 您可以使用this props navigation
  • iOS6旋转问题

    我知道你必须使用IOS6的新旋转方法 但似乎我写的方法不起作用 我将 plist 文件设置为允许所有旋转 但是不是肖像颠倒 然后我的里面有以下内容应用程序委托 self navController UINavigationControlle
  • 为什么我可以在 JavaScript 中定义函数之前使用该函数?

    即使在不同的浏览器中 此代码也始终有效 function fooCheck alert internalFoo We are using internalFoo here return internalFoo And here even t