为什么我不能在 try 块内定义之前使用 Javascript 函数?

2024-04-20

正如所讨论的here https://stackoverflow.com/questions/261599/why-can-i-use-a-function-before-its-defined-in-javascript,函数定义可以在定义之前使用。但一旦一段代码被包装在 try 块中,情况就不再是这样了。

这将显示“Hello world”:

hello();
function hello() { alert("Hello world"); }

但这显示“ReferenceError:hello未定义”:

try {
  hello();
  function hello() { alert("Hello world"); }
} catch (err) {
  alert(err);
}

因此,对于函数声明而言,try 块显然有一些“特殊”之处。有什么办法可以绕过这种行为吗?


Firefox 以不同的方式解释函数语句,显然它们破坏了函数声明的声明提升。 (关于命名函数/声明与表达式的好读物 http://kangax.github.com/nfe/ )

为什么Firefox对语句的解释不同是因为以下代码:

if ( true ) {
    function test(){alert("YAY");}
} else {
    function test(){alert("FAIL");}
}
test(); // should alert FAIL

由于声明提升,函数test应始终警告“失败”,但在 Firefox 中则不然。上面的代码实际上在 Firefox 中发出“YAY”警报,我怀疑导致这种情况发生的代码最终完全破坏了声明提升。

我假设当函数声明位于 if/else 或 try/catch 语句中时,Firefox 将函数声明转换为 var 声明。就像这样:

// firefox interpretted code
var test; // hoisted
if (true) {
   test = function(){alert("yay")}
} else {
   test = function(){alert("fail")}
}

在与 Šime Vidas 进行了简短的辩论之后,我不得不说 Firefox 对函数声明的处理是不标准的,因为:

生产 SourceElement : 语句针对函数进行处理 声明不采取任何行动.
生产 SourceElement : 声明 评价如下:

  1. 评估声明。
  2. 返回结果(1)。

FunctionDeclaration 和 Statement 都是 SourceElements,因此,语句内不应该有 FunctionDeclarations(if/else、try/catch)。给 Šime Vidas 一块布朗尼!

Try/catch 基本上是 if/else 的另一种形式,并且可能使用相同的异常代码。

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

为什么我不能在 try 块内定义之前使用 Javascript 函数? 的相关文章

  • JavaScript 在数组中查找

    我有一个像这样的数组 var movies Name The Red Violin ReleaseYear 1998 Director Fran ois Girard Name Eyes Wide Shut ReleaseYear 1999
  • JQuery 文件上传:在 data.submit() 上发送两个请求

    我正在尝试使用在我的应用程序中上传视频回形针 and jquery 文件上传 rails 我跟着使用回形针和 jquery 上传文件 https 5minutenpause com blog 2013 09 04 multiple file
  • 使用字符串函数查找周期字符串

    我正在寻找一种方法来检查字符串是否是周期性的或不使用 JavaScript 要匹配的示例字符串可以是11223331122333 然而 10101不应该匹配 来自 python 我使用了 RegEx 1 但速度相当慢 有没有任何字符串方法可
  • 如何绑定国家/地区更改国际电话输入

    我使用国家代码插件名称国际电话输入 js https intl tel input com 这是我的演示页面 在页面中我想清空手机 输入字段 当国家选择改变时 div class demo h3 Demo h3 div class iti
  • 同位素 Jquery 插件布局问题

    我正在尝试在此站点上设置同位素 它需要处理布局 并且我需要能够将项目附加到容器中 问题是它似乎没有正确初始化图像 这是我初始化它的方法 document ready function var container container cont
  • 如何在此彩票功能中显示所有猜中的号码?

    我用 JS 创建了一些简单的彩票功能 一切正常 我面临的唯一问题是如何显示所有已猜到的数字 我有 6 个独立的空间 其中必须提供数字 我的目标是显示随机空间中的滚动数字 它必须仅在 6 个空间之一中提供 这对我有用 但只显示 1 个数字 我
  • 音频端播放新文件

    我有一个webapp https radio repjesus com当您使用 ajax jquery 单击链接时加载并播放音轨 一切正常 但当曲目结束时 曲目将设置为循环 并且这种情况可以永远持续下去 我希望播放器从数据库中自动加载随机曲
  • Extjs中始终显示Slider的提示文本

    在 Extjs 4 1 1a 中 如何保持tip text滑块始终可见 目前 tip text每当用户拖动滑块栏时就可见 我搜索了docs http docs sencha com ext js 4 0 api Ext slider Sin
  • JS 中的触摸板滚动检测,无库

    我正在制作自己的小型 Javascript 库 可以轻松地将您网站 和我的网站 的默认滚动条替换为自定义滚动条 其中一部分意味着为 BODY 元素提供 overflow hidden 样式来隐藏正常的滚动条 但是 这会阻止除代码中完成的滚动
  • 从 PHP/Web 应用程序打印多个标签到 Dymo LabelWriter 450 Turbo

    我希望添加使用 Dymo LabelWriter 450 Turbo 打印多个标签的功能 我已经从 Dymo 网站下载了 DYMO Label v 8 SDK dmg 但看不到任何 Javascript Web 相关的 SDK 文件或文档
  • jQuery:在方法上取消绑定 jQuery 2.0

    在 jQuery 1 9 中live 已被弃用 因此新方法变为 document on mouseover blahblahfunc 我无法解除 blahblahfunc 的绑定 通过 unbind mouseover mouseout c
  • 如何在alert()之后给予focus()?

    我有类似的东西
  • 将带有非字符串关键字的 dict 传递给 kwargs 中的函数

    我使用具有签名功能的库f args kwargs 我需要在 kwargs 参数中传递 python dict 但 dict 不包含关键字中的字符串 f 1 2 3 4 Traceback most recent call last File
  • JS 检查深层对象属性是否存在[重复]

    这个问题在这里已经有答案了 我正在尝试找到一种优雅的方法来检查对象中是否存在某些深层属性 因此 实际上试图避免对未定义的情况进行巨大的保护性检查 例如 if typeof error undefined typeof error respo
  • JavaScript 中 == 和 === 的区别[重复]

    这个问题在这里已经有答案了 有什么区别 and 在 JavaScript 中 我也见过 and 运营商 还有更多这样的运营商吗 看看这里 http longgoldenears blogspot com 2007 09 triple equ
  • 在 JavaScript 中给变量字符串加上引号

    我有一个 JavaScript 变量 var text http example com 文本可以是多个链接 如何在变量字符串周围放置 例如 我希望字符串看起来像这样 http example com var text http examp
  • HTML5:从存储的二进制字符串播放视频

    我正在尝试使用 FileReader readAsBinaryString Blob File 将视频文件的内容作为二进制字符串读取 如示例中所示http www html5rocks com en tutorials file dndfi
  • 删除鼠标悬停时的 Vue 自定义过滤器

    我想使用 VueJS 2 删除鼠标悬停时的截断过滤器 这是模板中的过滤器 div class eng word english truncate div 这是过滤器本身 filters truncate function value let
  • Javascript 仅在 Chrome 中打开开发者工具后才起作用

    我和这里有同样的问题 为什么JavaScript只有在IE中打开开发者工具一次后才能工作 https stackoverflow com questions 7742781 why javascript only works after o
  • 监听鼠标事件……除了 div 的溢出:滚动滚动条?

    关于如何监听 mousedown 的任何建议 document exceptdiv 的溢出 滚动滚动条 我不确定滚动条是什么元素is为了参考它 您可以使用以下命令自行检查目标 document on mousedown function e

随机推荐

  • 如何防止从 char 数组到 bool 的隐式转换

    struct Foo void setBar bool bar bar bar bool bar int main Foo f f setBar true 由于类型转换 上面的代码编译成功 即使传递了一个 char 数组 其中bool是期待
  • 简化 if (x) Some(y) else None?

    这种常见模式感觉有点冗长 if condition Some result else None 我正在考虑使用一个函数来简化 def on A cond Boolean f gt A if cond Some f else None 这将顶
  • 后台工作者中止

    我最近尝试使用后台工作程序而不是 经典 线程 我意识到至少对我来说 它造成的问题多于解决方案 我有一个后台工作人员运行同步读取 在本例中是从串行端口 并在 1 行代码中被阻塞大约 30 秒 然后取消挂起不是解决方案 我看到 如果应用程序此时
  • 使 CSS 过渡效果适用于所有浏览器

    我目前有以下 CSS 它适用于 Google Chrome Webkit 但不适用于任何其他浏览器 使其与一切兼容的最佳方法是什么 正如你所看到的 它使用的是 webkit 但我不确定 moz 的等价物是什么 非常感谢 card margi
  • Submit() 函数有回调吗?

    我有这段代码 以及一个提交到框架的文件上传表单 setMyCookie name value 1 myform submit setMyCookie name value 2 问题 Webkit 浏览器似乎在提交表单之前或在提交表单的同时用
  • 如何使用 python selenium 单击 angularjs 链接?

    我有以下 html 其中包含使用相同类和元素的多个链接 并且我想单击具有 ng switch when next 和 python selenium 的链接 a class ng scope href a a class ng scope
  • 为什么接口变量默认是static和final?

    为什么Java中接口变量默认是static和final 来自 Philip Shaw 的 Java 界面设计常见问题解答 接口变量是静态的 因为 Java 接口不能以其自身的方式实例化 变量的值必须在不存在实例的静态上下文中分配 Final
  • matplotlib 文本标题未出现

    我无法理解为什么我的文字标题没有出现在我的绘图上 我发现文档对于图例和标题标签的放置顺序非常令人困惑 我的代码在这里 我不知道哪里出了问题 一切都按照我的预期出现 标题 轴标签 日期格式 除了标题文本根本不存在 fig plt figure
  • 避免 C 错误处理中的重复

    我经常编写最终成为长序列的代码 例如 int error error do something if error return error error do something else with some args if error re
  • 如何在最新的 VLC 版本上通过命令行设置音量?

    我一直在尝试在 Ubuntu 上通过终端设置 VLC 2 2 1 中的音量 但没有成功 参数 volume不存在了 Warning option volume no longer exists 并且我在帮助中找不到任何包含 卷 的内容 文档
  • Tensorflow 中的张量乘法

    我正在尝试在 NumPy Tensorflow 中进行张量乘法 我有 3 个张量 A M X h B h X N X s C s X T 我相信A X B X C应该产生一个张量D M X N X T 这是代码 同时使用 numpy 和 t
  • 在通过早期绑定使用库之前,我可以使用后期绑定来检查库是否存在吗?

    我喜欢在 VBA 项目中使用早期绑定 因为我喜欢在开发过程中自动完成方法名称等 我还喜欢知道如果我拼写错误了方法名称 编译器会警告我 但是 要使用早期绑定 我需要添加对相关库的引用 例如 Microsoft Scripting Runtim
  • 如何在独立的 .vbs 文件中从 VBScript 调用 DotNetFactory?

    我一直在探索扩展 QuickTest Professional 脚本编写功能的选项 并发现今天早上 所以我决定尝试一下 下面的代码在 QTP 环境中执行时工作正常 但我也可以看到它在 QTP 环境之外的用途 不幸的是 从独立的 vbs 文件
  • 从 Storyboard/xib 文件修改 UIImage 渲染模式

    是否可以修改一个UIImage s renderingMode来自故事板或 xib 编辑器 目标是申请tintColor对特定的UIImageView object 您可以在不设置图像渲染模式 xib文件 但是在一个 xcassets图书馆
  • 矢量化 scipy.integrate.quad

    我在用scipy integrate quad f a b args c 整合功能f之间a and b 添加另一个参数c 你可以考虑一下f as f lambda x y x y 据我了解 该功能需要a b c为浮点值 然而 我有很多积分需
  • iPhone - 按纬度和经度划分的 SQLite 距离

    我的应用程序中有一个嵌入式数据库 其中包含一些感兴趣点的所有纬度和经度 我需要知道我与这些点的距离 使用 GPS 获取我的位置 我的问题是 我刚刚发现 SQLite 无法使用我的查询来计算距离 因为它不计算三角函数 SIN COS 我试图避
  • Firebase/Android - 通过 UID 加载用户

    我只找到了加载当前登录用户的代码片段 FirebaseUser user FirebaseAuth getInstance getCurrentUser 但是 如果我需要加载其他用户的数据 例如图像路径和名称 怎么办 我想通过它们的 UID
  • 访问设备配置变量

    在我的 Rails 应用程序中 直接从视图访问 Devise 配置变量的方法是什么 我想展示config allow unconfirmed access for来自设计的 confirmable模块 该变量设置在devise rb初始化器
  • 当应用程序进入后台时(之前)iOS 拍摄的屏幕截图?

    希望大家都了解一下iOS在应用程序进入后台之前截取屏幕截图 我从那里得到的官方文件 http developer apple com library ios DOCUMENTATION iPhone Conceptual iPhoneOSP
  • 为什么我不能在 try 块内定义之前使用 Javascript 函数?

    正如所讨论的here https stackoverflow com questions 261599 why can i use a function before its defined in javascript 函数定义可以在定义之