深入探索 JS 的提升机制、函数与块作用域以及函数表达式和声明(下)

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 三、函数表达式和声明的区别🎭
    • 对比函数表达式和函数声明的语法
    • 解释函数声明的提升特性
    • 探讨函数表达式的优势和应用场景
  • 四、总结🎓
    • 回顾提升机制、函数与块作用域以及函数表达式和声明的重要性
    • 理解这些概念对 JavaScript 编程的意义
  • 参考资料

三、函数表达式和声明的区别🎭

对比函数表达式和函数声明的语法

函数表达式(Function Expression)和函数声明(Function Declaration)是 JavaScript 中定义函数的两种方式,它们在语法上有一些区别。

  1. 函数声明:

函数声明指的是使用function关键字定义的函数,它可以被提升(hoist),即在代码执行时,函数声明会被提升到当前作用域的顶部。这种定义方式的函数可以被提前调用,但不能被提前声明。

例如:

console.log(sum(1, 2)); // 3function sum(a, b) {return a + b;
}

在这个例子中,函数sum被提升了,所以在代码开头就可以调用sum函数。

  1. 函数表达式:

函数表达式指的是使用varletconst关键字定义的函数,它不会被提升。这种定义方式的函数只能在定义后使用,不能被提前调用。

例如:

console.log(sum(1, 2)); // ReferenceError: sum is not a functionlet sum = function(a, b) {return a + b;
};

在这个例子中,变量sum被定义为一个函数表达式,所以在调用sum函数时会抛出ReferenceError错误。

总结:函数声明和函数表达式在语法上的主要区别在于,函数声明可以被提升,而函数表达式不能被提升。在实际使用中,可以根据需要选择合适的定义方式。

解释函数声明的提升特性

函数声明的提升(Hoisting)是 JavaScript 中的一个特性,它指的是将函数声明提升到当前作用域的顶部。在代码执行时,函数声明会被提升,而函数表达式(即通过function关键字定义的函数)不会被提升。这个特性使得我们在代码中可以先使用函数,然后再进行声明,不会导致引用错误。

函数声明的提升过程如下:

  1. 解析器在执行代码之前,会将所有的函数声明提升到当前作用域的顶部。

  2. 提升后的函数声明在代码执行时,会按照正常的顺序进行处理。

例如:

console.log(sum(1, 2)); // 3function sum(a, b) {return a + b;
}

在这个例子中,函数sum被提升了,所以在代码开头就可以调用sum函数。

需要注意的是,函数表达式(即通过function关键字定义的函数)不会被提升。例如:

console.log(sum(1, 2)); // ReferenceError: sum is not a functionlet sum = function(a, b) {return a + b;
};

在这个例子中,变量sum被定义为一个函数表达式,所以在调用sum函数时会抛出ReferenceError错误。

了解函数声明的提升特性可以帮助我们更好地编写 JavaScript 代码,减少不必要的错误。同时,在编写一些复杂代码时,如闭包、模块化等,了解函数声明的提升特性可以让我们更好地理解代码的执行过程。

探讨函数表达式的优势和应用场景

函数表达式(Function Expression)是 JavaScript 中定义函数的一种方式,它具有以下优势和应用场景:

  1. 优势:
  • 灵活性:函数表达式可以作为变量赋值,这使得我们可以在需要的时候动态地创建函数,提高了代码的灵活性。

  • 闭包:函数表达式可以创建闭包,即函数可以访问其词法作用域中的变量,即使函数在其词法作用域之外被调用。闭包在实现回调函数、模块化等方面具有广泛的应用。

  • 函数柯里化:函数表达式可以用来实现柯里化(Currying),即将一个接受多个参数的函数转换为一系列使用一个参数的函数。柯里化在函数式编程中具有广泛的应用,可以提高代码的可读性和可维护性。

  1. 应用场景:
  • 回调函数:在异步编程、事件处理等场景中,常常需要使用回调函数。函数表达式可以方便地定义回调函数,提高代码的可读性和可维护性。

  • 模块化:函数表达式可以用来创建模块化的代码,将一组相关的函数封装到一个对象中,提高代码的可维护性和可复用性。

  • 动态创建函数:在某些场景下,可能需要根据用户输入、条件判断等因素动态地创建函数。函数表达式可以满足这种需求,提高代码的灵活性。

例如:

// 使用函数表达式创建回调函数
const getSum = (a, b) => a + b;// 使用函数表达式实现模块化
const math = {add: (a, b) => a + b,subtract: (a, b) => a - b
};// 使用函数表达式动态创建函数
const operation = prompt("请输入操作:");
const result = eval(operation)(3, 1);
console.log(result);

总之,函数表达式在 JavaScript 中具有独特的优势和广泛的应用场景,掌握函数表达式有助于提高代码的可读性、可维护性和灵活性。

四、总结🎓

回顾提升机制、函数与块作用域以及函数表达式和声明的重要性

提升机制、函数与块作用域以及函数表达式和声明是 JavaScript 中的重要概念,它们在 JavaScript 的代码组织和逻辑处理中起到了关键作用。

  1. 提升机制:

提升机制是 JavaScript 中的一个特性,它指的是将函数声明提升到当前作用域的顶部。在代码执行时,函数声明会被提升,而函数表达式(即通过function关键字定义的函数)不会被提升。这个特性使得我们在代码中可以先使用函数,然后再进行声明,不会导致引用错误。

  1. 函数与块作用域:

函数作用域指的是在函数内部定义的变量,只能在函数内部访问。块作用域指的是在{}(大括号)范围内定义的变量,只能在块范围内访问。函数作用域和块作用域的区分使得函数内部的变量与外部隔离开,提高了代码的可维护性和可复用性。

  1. 函数表达式和声明:

函数表达式指的是使用varletconst关键字定义的函数,它不会被提升。这种定义方式的函数只能在定义后使用,不能被提前调用。函数声明指的是使用function关键字定义的函数,它可以被提升,即在代码执行时,函数声明会被提升到当前作用域的顶部。这种定义方式的函数可以被提前调用,但不能被提前声明。

总之,提升机制、函数与块作用域以及函数表达式和声明是 JavaScript 中的重要概念,了解它们有助于更好地组织和管理代码,提高代码的可读性、可维护性和灵活性。

理解这些概念对 JavaScript 编程的意义

提升机制、函数与块作用域以及函数表达式和声明是 JavaScript 中的重要概念,它们在 JavaScript 的代码组织和逻辑处理中起到了关键作用。理解这些概念对 JavaScript 编程的意义如下:

  1. 提升机制:

提升机制是 JavaScript 中的一个特性,它指的是将函数声明提升到当前作用域的顶部。在代码执行时,函数声明会被提升,而函数表达式(即通过function关键字定义的函数)不会被提升。这个特性使得我们在代码中可以先使用函数,然后再进行声明,不会导致引用错误。理解提升机制有助于编写更加可靠和可维护的代码。

  1. 函数与块作用域:

函数作用域指的是在函数内部定义的变量,只能在函数内部访问。块作用域指的是在{}(大括号)范围内定义的变量,只能在块范围内访问。函数作用域和块作用域的区分使得函数内部的变量与外部隔离开,提高了代码的可维护性和可复用性。理解函数与块作用域有助于更好地组织和管理代码。

  1. 函数表达式和声明:

函数表达式指的是使用varletconst关键字定义的函数,它不会被提升。这种定义方式的函数只能在定义后使用,不能被提前调用。函数声明指的是使用function关键字定义的函数,它可以被提升,即在代码执行时,函数声明会被提升到当前作用域的顶部。这种定义方式的函数可以被提前调用,但不能被提前声明。理解函数表达式和声明有助于更好地使用 JavaScript 函数。

总之,提升机制、函数与块作用域以及函数表达式和声明是 JavaScript 中的重要概念,理解它们有助于更好地组织和管理代码,提高代码的可读性、可维护性和灵活性,从而编写出更加可靠和高效的 JavaScript 程序。

参考资料

JavaScript 文档
《JavaScript 高级程序设计》

希望这篇博客文章能够帮助到您,如果您有任何疑问或建议,欢迎在评论区留言。🙌感谢您的阅读

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案

网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂,选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台,它不仅具备高效的安全防护能力,还让网站安…

vue2实现无感刷新token

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: &#x1f4…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义: 设G(V,E)是一个具有n个顶点的有向图,V中的顶点序列称为一个拓扑序列,当且仅当满足下列条件:若从顶点到有一条路径,则在顶点序列中顶点必在之前。 2.基本思想…

GO数组解密:从基础到高阶全解

在本文中,我们深入探讨了Go语言中数组的各个方面。从基础概念、常规操作,到高级技巧和特殊操作,我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南。无论您是初学者还是经验丰富的开发者,这篇文章都将助您更深入地理解…

MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)

MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)。 MedicalGPT: Training Your Own Medical GPT Model with ChatGPT Training Pipeline. 训练医疗大模型,实现了包括增量预训练、有监督微…

软硬协同设计下的飞天盘古,是如何降低存储系统开销的?

云布道师 经过十几年的技术演进,阿里巴巴已经实现了统一存储的目标——即以“飞天盘古”系统作为统一底座,通过标准化、服务化和开放化的方式建立了完整的存储产品和服务体系,服务广大内部和外部客户。 “万古乾坤心上辟,于令日…

Uncertainty-Aware Mean Teacher(UA-MT)

Uncertainty-Aware Mean Teacher 0 FQA:1 UA-MT1.1 Introduction:1.2 semi-supervised segmentation1.3 Uncertainty-Aware Mean Teacher Framework 参考: 0 FQA: Q1: 不确定感知是什么意思?不确定信息是啥?Q2:这篇文章的精妙的点…

成都爱尔眼科胡建斌院长提醒眼底病,年轻人也得小心!

眼底病并非老年才会发生,现在很多人还很年轻就已检查出眼底病。明明年轻人代谢、免疫力都还挺好为什么会得眼底病啊? 眼底病是一大类眼部疾病的总称,眼科常见病之一,病变范围十分广泛。 眼球前面的角膜、晶体等,被称…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。 fastapi的两个核心…

Maven【1】(命令行操作)

文章目录 一丶创建maven工程二、理解pom.xml三、maven的构建命令1.编译操作2.清理操作3.测试操作4.打包操作5.安装操作 一丶创建maven工程 首先创建这样一个目录,然后从命令行里进入这个目录: 然后接下来就在这个命令行里进行操作了。 这个命令是&…

【Java程序设计】【C00317】基于Springboot的智慧社区居家养老健康管理系统(有论文)

基于Springboot的智慧社区居家养老健康管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧社区居家养老健康管理系统设计与实现,本系统有管理员、社区工作人员、医生以及家属四种角色权限 管…

C#学习总结

1、访问权限 方法默认访问修饰符:private 类默认访问修饰符:internal 类的成员默认访问修饰符:private 2、UserControl的使用 首先添加用户控件 使用时一种是通过代码添加,一种是通过拖动组件到xaml中

C++ Webserver从零开始:代码书写(十二)——双向链表处理非活动连接

前言 大家好,如题,今天我们来写定时器的代码。更正一下上一章的结束语哈哈哈,因为我发现相比于线程池,定时器类是相对底层的东西。不知道大家有没有玩过有建筑系统的游戏,比如mc,幻兽帕鲁这些,在…

芯片开发erp软件有哪些优势?

随着科技的飞速发展,芯片开发行业正逐渐成为推动科技进步的关键力量。在这一领域中,企业资源规划(ERP)软件的应用正逐渐普及,为芯片开发企业带来了许多显著的优势。下面,我们将详细介绍芯片开发ERP软件的优势。 一、提升管理效率 …

蓝桥杯-答疑

原题链接:用户登录 答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。一位同学答疑的过程如下 1.首先进入办公室,编号为 的同学需要 s,…

如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序,适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…

数据安全之路:深入了解MySQL的行锁与表锁机制

欢迎来到我的博客,代码的世界里,每一行都是一个故事 数据安全之路:深入了解MySQL的行锁与表锁机制 前言基础innodb中锁与索引的关系如何避免表锁 前言 在当今数据密集的应用中,数据库锁成为了确保数据一致性和并发操作的关键工具…

【Spring MVC】处理器映射器:AbstractHandlerMethodMapping源码分析

目录 一、继承体系 二、HandlerMapping 三、AbstractHandlerMapping 四、AbstractHandlerMethodMapping 4.1 成员属性 4.1.1 MappingRegistry内部类 4.2 AbstractHandlerMethodMapping的初始化 4.3 getHandlerInternal()方法:根据当前的请求url,…

前端学习——JS学习

文章目录 1. 定义变量,关键字 var、let、const2. 定义变量,数据类型3. 数组变量的操作4. 对象的操作5. JSON 字符串 1. 定义变量,关键字 var、let、const 这里主要是对var、let做比较 /** 1. var存在变量提升、let不存在变量提升 **/ cons…

WordPress使用

WordPress功能菜单 仪表盘 可以查看网站基本信息和内容。 文章 用来管理文章内容,分类以及标签。编辑文章以及设置分类标签,分类和标签可以被添加到 外观-菜单 中。 分类名称自定义;别名为网页url链接中的一部分,最好别设置为中文…