【JavaScript】函数声明和函数表达式的区别

news2024/9/17 7:25:33

文章目录

    • 一、函数声明
      • 1. 定义方式
      • 2. 作用域提升(Hoisting)
      • 3. 块级作用域
    • 二、函数表达式
      • 1. 定义方式
      • 2. 作用域提升(Hoisting)
      • 3. 自引用
    • 三、其他区别
      • 1. 函数名
      • 2. 可读性和代码组织
      • 3. 使用场景
    • 四、总结
      • 函数声明
      • 函数表达式

在JavaScript中,函数是核心组成部分,而定义函数的方法主要有两种:函数声明和函数表达式。虽然这两种方式在功能上类似,但它们在语法、作用域提升(hoisting)、使用场景等方面存在显著区别。下面我们将深入探讨这两种定义方式的不同之处。

一、函数声明

1. 定义方式

函数声明使用function关键字直接定义一个函数。函数声明必须包含函数名,并且函数名可以在代码的其他地方引用和调用。

function greet() {
  return 'Hello, world!';
}

函数声明的语法简单明了,定义后可以在整个作用域中引用。

2. 作用域提升(Hoisting)

函数声明会被提升到当前作用域的顶部。这意味着无论函数声明在代码中出现的位置,你都可以在声明之前调用它。

console.log(greet()); // 输出:Hello, world!

function greet() {
  return 'Hello, world!';
}

在上述示例中,即使在函数声明之前调用greet,代码仍能正常运行。

3. 块级作用域

函数声明在块级作用域(如iffor语句中)内部也会被提升到该块的顶部:

if (true) {
  function greet() {
    return 'Hello, world!';
  }
}

console.log(greet()); // 在严格模式下,这会导致错误

在非严格模式下,上面的代码可能会正常工作,但在严格模式下会抛出错误。因此,在块级作用域中使用函数声明时需谨慎。

二、函数表达式

1. 定义方式

函数表达式也使用function关键字定义一个函数,但该函数被赋值给一个变量。函数表达式可以是匿名的,也可以具名。

// 匿名函数表达式
const greet = function() {
  return 'Hello, world!';
};

// 具名函数表达式
const greet = function greetFunction() {
  return 'Hello, world!';
};

函数表达式的定义方式允许将函数作为一个值赋给变量,提供了更大的灵活性。

2. 作用域提升(Hoisting)

函数表达式不会被提升,这意味着你必须在定义函数表达式之后才能调用它。

console.log(greet()); // 报错:greet is not defined

const greet = function() {
  return 'Hello, world!';
};

在上述示例中,若在函数表达式定义之前调用greet,将会抛出错误,因为此时greet尚未定义。

3. 自引用

具名函数表达式在函数内部可以通过函数名进行自引用,这在递归调用时特别有用。

const factorial = function factorial(n) {
  if (n <= 1) return 1;
  return n * factorial(n - 1);
};

console.log(factorial(5)); // 输出:120

具名函数表达式提供了在递归函数内部自我引用的能力,使代码更具可读性和可维护性。

三、其他区别

1. 函数名

函数声明必须有函数名,而函数表达式可以是匿名的。具名函数表达式在调试时提供更有用的错误信息,但在大多数情况下,匿名函数表达式更常见。

2. 可读性和代码组织

函数声明通常用于定义主要功能或模块,因其语法直观,且可以在代码的任何地方调用。函数表达式则更常用于回调函数或立即调用的函数表达式(IIFE),因为它们更灵活。

// 立即调用的函数表达式(IIFE)
(function() {
  console.log('This is an IIFE');
})();

立即调用的函数表达式(IIFE)用于创建独立的作用域,避免污染全局命名空间。

3. 使用场景

函数声明适合定义独立的、可复用的函数,而函数表达式则更适合传递给其他函数作为参数或定义对象的方法。

// 使用函数表达式作为回调函数
setTimeout(function() {
  console.log('Hello after 1 second');
}, 1000);

// 作为对象的方法
const person = {
  name: 'Alice',
  greet: function() {
    console.log('Hello, ' + this.name);
  }
};
person.greet(); // 输出:Hello, Alice

函数表达式通常用于回调函数和对象方法,使代码更模块化和灵活。

四、总结

函数声明

  • 定义方式:使用function关键字直接定义一个命名函数。
  • 作用域提升:函数声明会被提升到当前作用域的顶部。
  • 使用场景:适合定义主要功能或模块,代码清晰直观。

函数表达式

  • 定义方式:使用function关键字定义一个函数并将其赋值给变量,可以是匿名函数或具名函数。
  • 作用域提升:不会被提升,必须在定义之后调用。
  • 使用场景:适合作为回调函数、立即调用的函数表达式或对象的方法,灵活性高。

推荐:

  • JavaScript
  • react
  • vue

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1958699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

昇思MindSpore学习入门-自动混合精度

混合精度&#xff08;Mix Precision&#xff09;训练是指在训练时&#xff0c;对神经网络不同的运算采用不同的数值精度的运算策略。在神经网络运算中&#xff0c;部分运算对数值精度不敏感&#xff0c;此时使用较低精度可以达到明显的加速效果&#xff08;如conv、matmul等&am…

Android 10.0 Launcher3仿ios的folder文件夹widget功能实现一

1.前言 在10.0的系统ROM开发中,在进行一些系统Launcher3定制功能开发中,需要实现folder文件夹widget的功能,由于launcher3 默认不支持folder跨行显示,所以就需要借助自定义的widget小部件功能来实现相关功能,接下来分析实现相关功能 2.Launcher3仿ios的folder文件夹widge…

【保姆级教程】免费域名注册 Cloudflare 域名解析 Ngnix端口转发

前段时间&#xff0c;带大家搞了两台云服务器&#xff1a; 玩转云服务&#xff1a;Oracle Cloud甲骨文永久免费云服务器注册及配置指南玩转云服务&#xff1a;手把手带你薅一台腾讯云服务器&#xff0c;公网 IP 基于这两台云服务器&#xff0c;我们玩转了很多有趣的开源项目&…

ElasticSearch(八)— 聚集查询1

一、总概 聚集查询(Aggregation)提供了针对多条文档的统计运算功能&#xff0c;它不是针对文档本身内容的检索&#xff0c;而是要将它们聚合到一起运算某些方面的特征值。 聚集查询与 SQL 语言中的聚集函数非常像&#xff0c;聚集函数在 Elasticsearch 中相当于是聚集查询的一…

掌控数据流的智能仪表板:Redpanda Console

Redpanda Console&#xff1a; 一站式管理&#xff0c;让数据流尽在掌控之中。- 精选真开源&#xff0c;释放新价值。 概览 Redpanda Console&#xff0c;是一款创新的Web界面工具&#xff0c;专为简化Kafka和Redpanda数据流的监控与管理而设计。它以用户友好的交互方式&#…

浏览器用户文件夹详解 - Favicons(二)

1. 引言 上一篇文章我们深入探讨了Chromium用户文件夹中的Bookmarks文件,了解了它的JSON结构以及如何解析和修改书签数据。 在本文中,我们将继续探索Chromium用户文件夹中的另一个重要文件:Favicons。Favicons,也就是我们常说的网站图标,是浏览器中不可或缺的一部分。它们不仅…

RK3568笔记四十七:PWM 子系统

若该文为原创文章&#xff0c;转载请注明原文出处。 pwm 子系统功能单一&#xff0c;很少单独使用&#xff0c;一般用于控制显示屏的背光、控制无源蜂鸣器、伺服电机、电压调节等等。 一、PWM介绍 PWM(Pulse width modulation)&#xff0c;脉冲宽度调制。在内核中 PWM 驱动较简…

并发编程工具集——并发容器-下(二十五)

List List 里面只有一个实现类就是 CopyOnWriteArrayList。CopyOnWrite&#xff0c;写的时候会将共享变量新复制一份出来&#xff0c;读操作完全无锁&#xff1b;适合读多写少的场景&#xff0c;写操作会复制数组&#xff0c;在新的数组中操作实现原理&#xff1a;CopyOnWriteA…

备考软考高级系统架构设计师,需要买哪些资料?

距离2024下半年软考高级系统架构设计师考试仅剩三个月&#xff01;时间紧迫&#xff0c;单单啃书已经不够了&#xff0c;毕竟是软考高级科目&#xff0c;难度不是那些初、中级可以比拟的。要想短时间速通架构考试&#xff0c;学会抓重点真的很重要&#xff0c;45分说多不多说少…

【音视频】RTSP、RTMP与流式传输

文章目录 前言RTSP与RTMPRTSP&#xff08;Real-Time Streaming Protocol&#xff09;RTMP&#xff08;Real-Time Messaging Protocol&#xff09;主要差异 什么是流式传输&#xff1f;流式传输的特点流式传输与传统下载的区别 使用VLC播放RTSP监控 总结 前言 在现代网络环境中…

C++ //练习 16.2 编写并测试你自己版本的compare函数。

C Primer&#xff08;第5版&#xff09; 练习 16.2 练习 16.2 编写并测试你自己版本的compare函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*********************************************************************…

PyTorch深度学习快速入门(下)

PyTorch深度学习快速入门&#xff08;下&#xff09; 一、现有网络模型的使用及修改&#xff08;一&#xff09;背景知识&#xff08;二&#xff09;修改网络模型的三种方法 二、网络模型的保存与加载&#xff08;一&#xff09;保存网络模型的两种方法&#xff08;二&#xff…

阿里云 服务器安装rabbit

现在我们去服务器安装一个rabbit 进入home 创建一个rabbit文件夹 /home/rabbit vim deployRabbit.sh 脚本内容 #!/bin/bash docker run -d \ --name dev.rabbit \ --network dev-net \ -p 15672:15672 \ -v ./data:/var/lib/rabbitmq \ --hostname dev.rabbit \ rabbitmq:…

css3 红色阴影边框紧急提醒呼吸灯特效

效果截图 代码 <!DOCTYPE html> <html><head><title>红色呼吸灯紧急特效</title><style>keyframes alarm {0% {box-shadow: 0 0 30px #ff0000;}50% {box-shadow: 0 0 60px #ff0000, inset 0 0 60px #ff0000;}100% {box-shadow: 0 0 30px …

八、【Python】基础 - 【Python while 循环全解析】:掌握无限循环的艺术

&#x1f4a1;&#x1f4da;【Python while 循环全解析】&#xff1a;掌握无限循环的艺术&#x1f4da;&#x1f4a1; 目录 1.基本语法 2.示例 3.注意事项 4.嵌套循环与循环控制语句 5.示例&#xff1a;使用 break 和 continue 6.示例&#xff1a;计数器 7.示例&#xf…

Web:Url 编码 -13

URL编码概述 HTTP协议只支持iso8859-1字符集。 而此字符集中只有英文数字常见符号。 所以HTTP原生是无法传输非iso8859-1字符的。 为了解决这个问题&#xff0c;提出了一种称之为URL编码的解决方案。 URL编解码详解 将非iso8859-1字符&#xff0c;进行转换 先将字符按照指定码表…

时间序列分析方法之 -- 自回归移动平均模型(Autoregressive Moving Average, ARMA)原理及Python代码示例

目录 原理 适用情况 Python 示例代码 结论 原理 自回归移动平均模型&#xff08;Autoregressive Moving Average, ARMA&#xff09;是一种结合了自回归&#xff08;AR&#xff09;模型和移动平均&#xff08;MA&#xff09;模型的时间序列分析模型。它适用于描述和预测平稳…

AGI思考探究过程中的意义、价值与乐趣 Ⅰ

探究以泛GPT为代表的预训练自回归next token prediction GenAI(即llm)与Alpha系列为代表的RL&#xff0c;再到Sora为代表的DiT视觉生成领域模型的本质普遍性及表象差异&#xff0c;以及为什么要将其两者或三者联系甚至融合起来看待&#xff1f;本质上是尝试对比采用上述三种模型…

昇思MindSpore 应用学习-Diffusion扩散模型-CSDN

Diffusion扩散模型 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请…

【项目管理】高手项目经理都在用的6个SOP

SOP&#xff08;Standard Operating Procedure&#xff09;流程是一种标准化的操作指南&#xff0c;旨在确保组织或团队在各种情况下都能高效、一致地完成任务。SOP流程通常包括详细的步骤、关键控制点和责任分配&#xff0c;以确保质量和安全。SOP流程涉及从日常运营到危机管理…