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

news2025/7/14 21:04:13

在这里插入图片描述

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

文章目录

  • 摘要
  • 引言
  • 一、提升机制🚀
    • 解释提升机制的基本概念
    • 展示提升机制在变量和函数声明中的应用
  • 二、函数与块作用域🎯
    • 介绍函数作用域和块作用域的区别
    • 讲解如何利用块作用域来控制变量的可见性

摘要

本文将深入探讨 JavaScript 中的提升机制、函数与块作用域,以及函数表达式和声明的区别。通过详细的示例和解释,帮助读者更好地理解这些重要的概念。🎯

引言

🎈大家好,我是阿珊。在 JavaScript 中,提升机制、函数与块作用域以及函数表达式和声明是非常重要的概念。理解它们对于编写高效、可维护的代码至关重要。本文将带您深入了解这些主题,并通过实际示例进行演示。让我们一起探索 JavaScript 的奥秘吧!💻

一、提升机制🚀

解释提升机制的基本概念

提升(Promotion)是 JavaScript 性能优化的一种技术,它指的是将变量提升到函数作用域顶部,以便在函数整个过程中都可以访问。这样可以减少不必要的变量声明,提高代码运行效率。

在 JavaScript 中,提升主要分为两种:变量提升(Variable Promotion)和函数提升(FunctionPromotion)。

  1. 变量提升:变量提升指的是将变量声明提升到当前作用域的顶部。在 JavaScript 代码执行时,变量声明会被提升到当前作用域的顶部,而赋值操作不会被提升。因此,在代码中,我们可以先使用变量,然后再进行声明,不会导致引用错误。例如:
console.log(a); // undefined
var a = 1;
console.log(a); // 1

在这个例子中,变量a被提升了,所以我们在代码开头就可以访问到a,只是它的值为undefined

  1. 函数提升:函数提升指的是将函数声明提升到当前作用域的顶部。在 JavaScript 代码执行时,函数声明会被提升到当前作用域的顶部,而函数表达式(即通过function关键字定义的函数)不会被提升。因此,在代码中,我们可以先使用函数,然后再进行声明,不会导致引用错误。例如:
console.log(function() {
  console.log('hello');
}); // 输出函数

function hello() {
  console.log('hello');
}
console.log(hello); // 输出函数

在这个例子中,函数hello被提升了,所以我们在代码开头就可以访问到hello,只是它是一个函数表达式,不能直接调用。

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

展示提升机制在变量和函数声明中的应用

提升机制在变量和函数声明中的应用示例:

  1. 变量提升:
console.log(a); // undefined
var a = 1;
console.log(a); // 1

在这个例子中,变量a被提升了,所以我们在代码开头就可以访问到a,只是它的值为undefined

  1. 函数提升:
console.log(function() {
  console.log('hello');
}); // 输出函数

function hello() {
  console.log('hello');
}
console.log(hello); // 输出函数

在这个例子中,函数hello被提升了,所以我们在代码开头就可以访问到hello,只是它是一个函数表达式,不能直接调用。

需要注意的是,提升机制只对声明有效,对赋值操作无效。例如:

var a = undefined;
console.log(a); // undefined
a = 1;
console.log(a); // 1

在这个例子中,变量a的赋值操作没有被提升,所以我们在代码开头访问a时,得到的是undefined

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

二、函数与块作用域🎯

介绍函数作用域和块作用域的区别

函数作用域(Function Scope)和块作用域(Block Scope)是 JavaScript 中两种不同的作用域类型。

  1. 函数作用域:

函数作用域指的是在函数内部定义的变量,只能在函数内部访问,函数外部无法访问。函数作用域是函数式编程的核心概念,它使得函数内部的变量与外部隔离开,提高了代码的可维护性和可复用性。

例如:

function createCounter() {
  let count = 0;
  return function() {
    count++;
    console.log(count);
  };
}

const counter = createCounter();
counter(); // 1
counter(); // 2

在这个例子中,变量count是函数createCounter的局部变量,只能在函数内部访问,函数外部无法访问。

  1. 块作用域:

块作用域指的是在{}(大括号)范围内定义的变量,只能在块范围内访问。块作用域通常用于限制变量作用范围,避免全局变量污染。

例如:

let a = 1;
{
  let a = 2;
  console.log(a); // 2
}
console.log(a); // 1

在这个例子中,变量a在大括号范围内被重新定义,块作用域限制了变量a的作用范围,使得块内的a与块外的a互不影响。

总结:函数作用域和块作用域都是 JavaScript 中重要的作用域类型,它们分别用于函数式编程和限制变量作用范围。了解这两种作用域的区别,可以帮助我们更好地编写 JavaScript 代码,提高代码的可维护性和可复用性。

讲解如何利用块作用域来控制变量的可见性

在 JavaScript 中,可以使用块作用域(Block Scope)来控制变量的可见性。块作用域指的是在{}(大括号)范围内定义的变量,只能在块范围内访问。通过使用块作用域,可以避免全局变量污染,提高代码的可维护性。

下面是一些利用块作用域控制变量可见性的示例:

  1. 使用if语句定义块作用域:
let a = 1;
if (true) {
  let a = 2;
  console.log(a); // 2
}
console.log(a); // 1

在这个例子中,if语句内部定义了一个新的变量a,它与外部的变量a是不同的。if语句内部的变量a具有块作用域,只能在if语句内部访问。

  1. 使用for循环定义块作用域:
let a = 1;
for (let i = 0; i < 3; i++) {
  console.log(a); // 1 1 1
}
console.log(a); // 1

在这个例子中,for循环内部定义了一个新的变量a,它与外部的变量a是不同的。for循环内部的变量a具有块作用域,只能在循环内部访问。

  1. 使用trycatch语句定义块作用域:
let a = 1;
try {
  let a = 2;
  console.log(a); // 2
} catch (error) {
  console.log(a); // 1
}

在这个例子中,trycatch语句内部定义了一个新的变量a,它与外部的变量a是不同的。trycatch语句内部的变量a具有块作用域,只能在语句内部访问。

通过使用块作用域,可以有效地控制变量的可见性,避免全局变量污染,提高代码的可维护性。在编写一些复杂代码时,如模块化、闭包等,利用块作用域可以更好地理解代码的执行过程。

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

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

相关文章

SpringBoot和ApiFox整合快速上手

前置&#xff1a;IDEA版本IntelliJ IDEA 2023.2.4&#xff0c;Apifox 2.5.6 安装插件&#xff1a;Apifox Helper1.2.1 目录 1.文档生成 2.提取登录接口token 1.文档生成 把密钥配置到 修改日志编码&#xff1a; 导入成功:文档就会出现 2.提取登录接口token 之后我们再使用的…

综合服务 IntServ

目录 综合服务 IntServ IntServ 定义的两类服务 IntServ 的四个组成部分 流 (flow) 资源预留协议 RSVP RSVP 协议的工作原理 IntServ 体系结构在路由器中的实现 综合服务 IntServ 体系结构存在的主要问题 综合服务 IntServ 综合服务 IntServ (Integrated Services) 可…

五种多目标优化算法(MOCS、MOFA、NSWOA、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤&#xff1a; 1. 定义问题&#xff1a;首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数&#xff0c;这些目标函数可能…

用于电机控制应用的动态制动电阻器?

这种复杂的医疗系统中&#xff0c;高度可靠的无源元件始终是必不可少的。在单个设计中&#xff0c;每个有源集成电路 &#xff08;IC&#xff09; 需要多达 20 个无源元件。通常需要专业元件&#xff0c;这是实现商品、批量生产的电阻器产品领域之外的特定应用价值所必需的。设…

微信小程序-宿主环境-开发文档学习笔记

查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever 微信小程序开发指南 微信小程序开发文档 渲染层和逻辑层 WXML 模板和 WXSS 样式工作在渲染层&#xff0c;JS 脚本工作在逻辑层 渲染层和数据相关。逻辑层负责产生、处理数据。逻辑层通过 Page 实例的 setD…

matlab simulink变压器温度仿真

1、内容简介 略 48-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab simulink变压器温度仿真_哔哩哔哩_bilibili 4、参考论文 略 大型油浸风冷变压器绕组温度场分析_高原 基于顶层油温的变压器绕组热点温度计算改进模型_陈伟根 基于热电类比理论的油浸式电…

共同学习|Spring Cloud Alibaba一一Nacos配置

Nacos配置中心 在服务或者应用运行过程中&#xff0c;提供动态配置或者元数据以及配置管理的服务提供者。 从Nacos中拉去配置文件 pom文件 2、bootstrap.yml 修改application.yml为bootstrap.yml spring:cloud: nacos:config:server-addr: localhost:8848 #nacos服务地址…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined&#xff0c;这是由于配置babel出错问题&#xff0c;由于使用了es7语法如async/await而当前babel版本过低 解决&#xff1a; npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置&#xff1a; &qu…

python56-Python的断言

断言语句和if分支有点类似它用于对一个bool表达式进行断言,如果该bool表达式为True,该程序可以继续向下执行;否则程序会引发AssertionError错误。 # !/usr/bin/env python# -*- coding: utf-8 -*-# Time : 2024/01# Author : Laopiage input("请输入你的年龄&#xff1a…

QT文件IO

七、文件IO QFileDialog文件对话框 与QMessageBox一样&#xff0c;QFileDialog也继承了QDialog类&#xff0c;直接使用静态成员函数弹窗&#xff0c;弹窗的结果&#xff08;选择的文件路径&#xff09;通过函数返回值返回。 // 获取一个打开或保存的文件路径 // 参数1&#xff…

Git+py+ipynb Usage

0.default config ssh-keygen -t rsa #之后一路回车,当前目录.ssh/下产生公私钥 cat ~/.ssh/id_rsa.pub #复制公钥到账号 git config --global user.email account_email git config --global user.name account_namebug of ipynb TqdmWarning: IProgress not found. Please …

【JavaEE】_HttpServlet类

目录 1. init方法 2. destory方法 3. service方法 4. servlet生命周期 前文已经提及到&#xff1a;servlet是tomcat提供的&#xff0c;用于操作HTTP协议的一组API&#xff0c;可以将这组API理解为HTTP服务器的框架&#xff1b; 编写一个servlet程序&#xff0c;往往都要继…

记一次pulsar数据丢失排查

记一次pulsar数据丢失排查 背景 生产者往pulsar写消息时会有递增的序列号字段&#xff0c;消费端在消费时&#xff0c;会出现序列号断层。当下无法确定是生产端、mq、消费端哪个地方丢失了数据&#xff0c;所以先从生产端进行排查。 生产端的消息发送是通过sendAsync的异步方…

基于插件实现RabbitMQ“延时队列“

1.官网下载 在添加链接描述下载rabbitmq_delayed_message_exchange 插件,本文以v3.10.0为例 1.1.上传安装包 scp /Users/hong/资料/rabbitmq_delayed_message_exchange-3.10.0.ez root10.211.55.4:/usr/local/software1.2.将文件移入RabbitMQ的安装目录下的plugins目录 m…

EasyRecovery2024个人免费版本电脑手机数据恢复软件下载

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;能够帮助用户恢复丢失、删除、格式化或损坏的数据。无论是由于误操作、病毒攻击、硬盘故障还是其他原因导致的数据丢失&#xff0c;EasyRecovery都能提供有效的解决方案。 该软件支持从各种存储介质恢复数据&#xff0c;…

linux-并发通信

一.linux-tcp通信框架 1.基础框架 1.1 tcp 服务器框架 1.套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol);
 返回的文件描述符可以指向当前的socket&#xff0c;后续通过对文件描述符的访问就可以配置这个socket 成功时返回文件…

云原生应用测试:挑战与方法

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

Linux进程 ----- 信号处理

前言 从信号产生到信号保存&#xff0c;中间经历了很多&#xff0c;当操作系统准备对信号进行处理时&#xff0c;还需要判断时机是否 “合适”&#xff0c;在绝大多数情况下&#xff0c;只有在 “合适” 的时机才能处理信号&#xff0c;即调用信号的执行动作。 一、信号的处理…

万界星空科技MES系统,实现数字化智能工厂

万界星空科技帮助制造型企业解决生产过程中遇到的生产过程不透明&#xff0c;防错成本高&#xff0c;追溯困难&#xff0c;品质不可控&#xff0c;人工效率低下&#xff0c;库存积压&#xff0c;交期延误等问题&#xff0c;从而达到“降本增效”的目标。打通各个信息孤岛&#…

Python性能测试框架Locust实战教程

01、认识Locust Locust是一个比较容易上手的分布式用户负载测试工具。它旨在对网站&#xff08;或其他系统&#xff09;进行负载测试&#xff0c;并确定系统可以处理多少个并发用户&#xff0c;Locust 在英文中是 蝗虫 的意思&#xff1a;作者的想法是在测试期间&#xff0c;放…