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

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过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.hqwc.cn/news/492750.html

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

相关文章

《高考》期刊杂志投稿邮箱知网教育类期刊发表

《高考》杂志是由国家新闻出版总署批准的正规教育类期刊。主要宣传高中新课程改革的专业性&#xff0c;是教育管理工作者、高中一线教师交流经验、探讨问题的重要平台&#xff0c;期刊突出政策性、针对性、指导性&#xff0c;是一本以教育科研成果展示为主&#xff0c;兼具教育…

Sora 提示词每日分享 | 中英文对照

每日分享一个 sora 创意视频提示词之《冲浪者在历史大厅的巨浪中展现技艺》 sora提示词视频 prompt: In an ornate, historical hall, a massive tidal wave peaks and begins to crash. Two surfers, seizing the moment, skillfully navigate the face of the wave. 提示词…

变革中的容器技术

容器化技术的优点 容器化是一种将应用程序和其所需的依赖项&#xff0c;封装在一个可在任何基础架构上一致运行的轻量级可执行文件&#xff08;即容器&#xff09;的技术。容器化技术可以大大简化应用程序的部署、管理和维护&#xff0c;提高运维效率和可靠性。 容器化技术有…

如何实现多账户管理?海外代理IP推荐

伴随着互联网的发展&#xff0c;目前越来越多的用户开始拥有不止一个社交媒体或者电商平台等类型的账号&#xff0c;但实际上不论是社交平台还是电商平台对于用户的多账号使用行为都十分的抵制。如果用户不采取任何措施直接长时间进行多账户操作的话&#xff0c;可能会遇到以下…

有那种试卷还原软件吗?分享3款一键还原空白的工具!

在数字化学习的浪潮中&#xff0c;试卷还原软件作为一种新型的学习工具&#xff0c;正逐渐受到广大学生和教育工作者的青睐。这类软件不仅能够帮助我们快速整理、分析试卷&#xff0c;还能通过智能识别技术&#xff0c;将纸质试卷转化为电子文档&#xff0c;极大地提高了学习效…

微信小程序简单输入框布局(合并忘记密码和修改页面)

微信小程序简单入门级输入框布局&#xff0c;将忘记密码和修改页面合并到一个页面&#xff0c;根据传入的参数自动切换显示的界面信息。 上代码 1、js代码&#xff1a; Page({/*** 页面的初始数据*/data: {current: 0,},/*** 生命周期函数--监听页面加载*/onLoad(options) {//…

springboot集成quartz定时任务并接入后台管理系统(copy即用)

说明:项目启动后会根据设置的时间进行执行,业务代码根据自己的需求更改,数据库文件在最后(记得清空数据库哦~)这里需要注意的一点就是className字段表示的是下面的对应的DynamicTask的路径如:com.example.demo.quartz.task.DynamicTask,如有多个定时任务copy并更改Dynam…

成都直播产业园进行时!发挥直播电商优势 赋能优势产业发展

在当今数字化的时代&#xff0c;直播电商已经成为一种新型的商业模式&#xff0c;为优势产业的发展带来了巨大的机遇。通过直播电商&#xff0c;优势产业能够更好地展示自身特色和优势&#xff0c;扩大渠道&#xff0c;提升品牌影响力&#xff0c;从而实现产业的升级和转型。天…

实用设计方案:如何利用数字选择器搭建一个简单有效的脉冲发生电路

脉冲发生电路是电子电路中常见的一种电路&#xff0c;用于产生一系列脉冲信号。数字选择器是一种重要的电子元件&#xff0c;具有多路输入、单路输出的特点&#xff0c;常用于数据选择和信号调制等应用。下面将介绍如何利用数字选择器搭建一个简单而有效的脉冲发生电路&#xf…

《绝地求生》提示msvcp140.dll丢失如何修复?分享5种靠谱的解决方法

在玩绝地求生&#xff08;PUBG&#xff09;游戏过程中&#xff0c;如果遇到系统弹出“提示请重新安装软件msvcp140.dll”的信息&#xff0c;这究竟是什么原因导致的呢&#xff1f;msvcp140.dll这个文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;是许多…

stm32:timer模块,如何计数,计数模块很简单,但是需要注意分频的设置,分频设置为7199,

首先看配置项 计数模块很简单&#xff0c;但是需要注意分频的设置&#xff0c;分频设置为7199&#xff0c; 然后计数寄存器里的值65535作为默认值&#xff0c;也可以在matlab里修改 下图为配置项目&#xff1a; 下图为matlab模型&#xff1a; 下图为运行结果&#xff1a; 计…

2024年开学季推荐:数码装备购物清单,校园生活必备神器

随着开学的钟声即将敲响&#xff0c;全新的学年画卷正在缓缓展开。它不仅承载着我们对知识的渴望和对未来的憧憬&#xff0c;更是我们挥洒青春、展示才华的舞台。在这个充满无限可能的新起点&#xff0c;每一位学子都怀着期待&#xff0c;准备踏上成长的征程。然而为了更好地适…