JavaScript 中命名函数优于匿名函数吗? [复制]

2023-12-10

可能的重复:
JavaScript:var functionName = function() {} 与 function functionName() {}

在 Javascript 中提取函数有两种可能的方法:

var foo = function() { ... }

这有点做作;另一个常见的模式是:

var foo = {
   baz: 43,
   doSomething: function() {
       // ...
   }
}

versus

function foo() { 
  // ... 
}

是否有明确的理由选择其中之一?


这一切都取决于您声明函数的位置的偏好;吊装。

JavaScript 解释器总是将函数声明和变量声明不可见地移动(“提升”)到其包含范围的顶部。显然,函数参数和语言定义的名称已经存在。这意味着像这样的代码:

function foo() {
    bar();
    var x = 1;
}

实际上是这样解释的:

function foo() {
    var x;
    bar();
    x = 1;
}

请注意,声明的赋值部分没有被提升。只有名字被高举。函数声明的情况并非如此,函数声明的整个函数体也会被提升。

function test() {
    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
    function bar() { // function declaration, given the name 'bar'
        alert("this will run!");
    }
}
test();

在这种情况下,只有函数声明的主体被提升到顶部。名称“foo”被提升,但主体被保留,以在执行期间分配。

您可以使用类似于函数声明的语法为函数表达式中定义的函数命名。这不会使其成为函数声明,并且名称不会进入作用域,主体也不会被提升。

foo(); // TypeError "foo is not a function"
bar(); // valid
baz(); // TypeError "baz is not a function"
bin(); // ReferenceError "bin is not defined"

var foo = function () {}; // anonymous function expression ('foo' gets hoisted)
function bar() {}; // function declaration ('bar' and the function body get hoisted)
var baz = function bin() {}; // named function expression (only 'baz' gets hoisted)

foo(); // valid
bar(); // valid
baz(); // valid
bin(); // ReferenceError "bin is not defined"

因此,如果您希望将函数提升到顶部,请使用function declaration否则使用expression。我更喜欢后者,因为我通常使用以下方法构建对象文字function expressions.

Named function expressions当抛出错误时可以很方便。控制台会告诉您该功能是什么,而不是说明anonymous aka 堆栈跟踪.

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

JavaScript 中命名函数优于匿名函数吗? [复制] 的相关文章

随机推荐

  • 使用 jQuery 从 URL 获取查询字符串 [重复]

    这个问题在这里已经有答案了 我有以下网址 http www mysite co uk location mylocation1 我需要得到的值location将 URL 转换为变量 然后在 jQuery 代码中使用它 var thequer
  • 在 ruby​​ 中如何判断输入的字符串是大写还是小写?

    我正在尝试编写一个程序 当输入单个字母时 如果它是大写字母 则将其保留为大写字母并返回它 如果它是小写字母 则将其转换为大写字母 我该如何编写才能判断字符串最初是大写还是小写 只需将字符串转换为大写并与原始字符串进行比较 string st
  • 设置 SCORM 课程进度

    我只是想知道 是否可以在运行时在 SCORM 文件中设置课程进度 我应该检查哪种方法 进度将根据 SCO 开发人员的学习要求来定义 一般来说 达到的目标 cmi objectives 数量或学习者访问的页面数量 要存储进度 如果 SCORM
  • Shiny 中 fillPage 的基本示例 - 它是如何工作的?

    我不明白如何获得一个图来完全填充我的仪表板 除了标题之外 我想我必须使用 fillPage 但我无法让它工作 这是我的例子 我很感谢任何提示 ipak lt function pkg new pkg lt pkg pkg in instal
  • 为什么这个并行代码比类似的非并行版本慢?

    我有以下代码 从 LINQPad 复制到此处 显然 我似乎不明白 TPL 是如何工作的 或者代码是垃圾 为什么并行版本比非并行版本运行得慢 for int i 0 i lt 100 i ParallelOptions ops new Par
  • Firebase 未将 CORS 标头添加到 REST 请求

    有没有办法为 REST 端点启用 CORS 如上所述here and here Firebase 似乎不再默认添加它们 对于不需要实时连接或无法使用 Websocket 的应用程序来说 这将很有帮助 这是对 Firebase 的 REST
  • R:尽可能均匀地分配数量 II

    我们有一定的数量 例如300 单位 该数量应尽可能均匀地分布在 40 个 槽 或 箱 中 如果每个槽都相同 那就很容易了 所以每个槽都是 7 5 然而 插槽的大小各不相同 我们不能 填充 超过其 大小 允许的范围 例如如果只有 4 个 我们
  • 仅将 HTML、CSS 网页部署到 Tomcat

    我刚刚开始开发website 我现在所拥有的就是HTML 页面由几个人支持CSS 样式表 我可以创建吗来自 HTML 和 CSS 页面的 WAR 文件 我如何将它们部署到 Tomcat 服务器上 Thanks 没有真正需要创建一场战争来从
  • 如何在同一页面上的 Angular 应用程序和非 Angular 应用程序之间进行通信?

    我正在通过 Angular bootstrapping 使用 Angular 模块将一段非 Angular 网页转换为 Angular 版本 它工作得很好 除了它需要与页面的其他部分进行通信这一事实之外 不幸的是 我目前无法将页面的其余部分
  • 简单的计算由于某种原因不起作用

    好吧 我正在尝试计算两个值的百分比 这应该非常简单 但由于某些奇怪的原因它不起作用 我太累了 太笨了 无法弄清楚 这是我的代码 它一直返回 0 我在调试时检查了这些值 FilesCompleted 为 295 TotalFilesCount
  • 如何将小数四舍五入到小数点后 2 位 (Java)

    我对java相当陌生 我必须创建这个程序 但我不知道从哪里开始 有人可以帮助我做什么以及如何编写代码来开始吗 编写一个模拟收银机的程序 提示用户输入三件商品的价格 将它们加在一起即可得到小计 确定小计的税费 6 求销售小计加税的总金额 显示
  • 如何从 C# 或 VB.Net 使用 Win32 'DwmSetIconicThumbnail'?

    我想使用DwmSetIconicThumbnail函数为我的应用程序的缩略图预览设置静态图像 正如上面的参考链接中指出的 首先需要调用Dwm设置窗口属性启用DWMWA FORCE ICONIC REPRESENTATION and DWMW
  • Xamarin 项目在 Visual Studio 2015 中不可用

    我有一个 Xamarin 解决方案 我已经在 Mac 上工作了一段时间 但现在通过 Visual Studio 中的 Xamarin 集成 我想在 Windows 计算机上工作 我在 Visual Studio 2015 Enterpris
  • DropDownList 的编辑器模板

    我为字符串字段创建了一个 EditorTemplate 它实现了引导程序 如下所示 using MyProject model object div class form group Html LabelFor m gt m new cla
  • 无法将数据表绑定到图表控件

    我想在我的测试应用程序中使用极坐标图 我有一个包含几列的数据表 其中名称为 X 的列应提供 x 值成员 其他列应提供 y 值成员 我在 MSDN 上找到了一个教程 但它并没有真正起作用 因为该行 chart1 DataBindTable d
  • 使用 Highcharts 通过 JSON 重新加载图表数据

    我正在尝试根据页面中其他位置的按钮单击 通过 JSON 重新加载 Highcharts 图表的数据 最初 我想显示一组默认数据 按类别支出 然后根据用户输入加载新数据 例如 按月支出 我能想到的从服务器输出 JSON 的最简单方法是将 GE
  • 如何在“打开方式”对话框中设置程序名称?

    我想要程序读取VLC Move on end 我已将程序集信息修改为以下内容 但无济于事 如何更改 打开方式 对话框中显示的名称 它作为FriendlyAppName 值存储在注册表中的HKCR Applications YourExeNa
  • ASP.NET 中 Session 对象的使用

    我刚刚接到一项新任务来引导其他人创建的网站 但我对网络绝对是新手 该网站采用 ASP NET C 语言 除了Session对象之外 代码本身并不难理解 我不明白它在哪里 如何以及为什么使用 请问有人可以用一个可能的例子解释 Session
  • 如何在 Project Reactor 中实现轮询逻辑?

    我有一个方法发送请求以获取作业状态并返回状态 如下所示 Mono
  • JavaScript 中命名函数优于匿名函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript var functionName function 与 function functionName 在 Javascript 中提取函数有两种可能的方法 var foo func