【前端|Javascript第3篇】探秘JavaScript的作用域与作用域链:小白也能轻松搞懂!
大家好!欢迎来到本篇博客,今天我们将解开JavaScript编程世界中的一道神秘面纱:作用域与作用域链。很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。如果你对这些概念感到困惑,不要担心!本文将以通俗易懂的方式,用趣味横生的例子,为你详解这些概念,让你轻松掌握其中的精髓。
🌟本文目录
- 🚀 作用域:代码的隐秘地盘
- 📚 作用域的类型
- 🏙️ 全局作用域:变量的大舞台
- 🏠 函数作用域:变量的私密角落
- 🧱块级作用域:变量的秘密小角落
- 🔮 作用域嵌套:代码的魔法迷宫
- 🚁 词法作用域:代码的时光机器
- 🔗 作用域链:连接不同作用域的纽带
- 结语
🚀 作用域:代码的隐秘地盘
首先,让我们来理解一下什么是作用域。在JavaScript中,作用域指的是变量的可访问性范围。也就是说,不同位置的代码可以访问不同范围内的变量。就好像你家的客厅和卧室里的东西,客厅里的东西不一定在卧室里能找到。
📚 作用域的类型
Javascript中有三种作用域:
- 全局作用域;
- 函数作用域;
- 块级作用域;
🏙️ 全局作用域:变量的大舞台
全局作用域就像是城市的中心广场,所有人都可以访问。在任何地方定义的全局变量都可以被整个脚本访问。例如:
let globalVar = "我是全局变量";function showGlobalVar() {console.log(globalVar);
}showGlobalVar(); // 输出:我是全局变量
在这个例子中,变量globalVar在全局范围内定义,所以函数showGlobalVar可以自由访问它。
🏠 函数作用域:变量的私密角落
与之相对,函数作用域就像是你的私人领地。在函数内定义的变量只能在函数内部访问,就像是你的房间里的物品,无法被其他房间的人看到。
function localScopeExample() {let localVar = "我是局部变量";console.log(localVar);
}localScopeExample(); // 输出:我是局部变量console.log(localVar); // 报错!localVar未定义
在这个例子中,变量localVar只能在localScopeExample函数内部访问,尝试在函数外部访问它会导致错误。
🧱块级作用域:变量的秘密小角落
相似于函数作用域,块级作用域是你的编程领地中的一处秘密小角落。在块级作用域中定义的变量只能在该块中访问,就如同你的书房里的私人收藏,无法被其他房间的人所窥见。
{// 块级作用域中的变量let greeting = 'Hello World!';var lang = 'English';console.log(greeting); // Prints 'Hello World!'
}
// 变量 'English'
console.log(lang);
// 报错:Uncaught ReferenceError: greeting is not defined
console.log(greeting);
在这个示例中,ES6引入了let和const关键字,和var关键字不同,在大括号中使用let和const声明的变量存在于块级作用域中。在大括号之外不能访问这些变量。在大括号内使用var声明的变量lang是可以在大括号之外访问的。使用var声明的变量不存在块级作用域中。
🔮 作用域嵌套:代码的魔法迷宫
像Javascript中函数可以在一个函数内部声明另一个函数一样,作用域也可以嵌套在另一个作用域中。请看例子:
var name = 'Peter';
function greet() {var greeting = 'Hello';{let lang = 'English';console.log(`${lang}: ${greeting} ${name}`);}
}
greet();
这里我们的代码就像是在城堡的城堡的小房间中,充满了奇妙的层次感。我们有三层作用域嵌套,就好像是在探索城堡的套间的嵌套,首先第一层是一个块级作用域(let
声明的),被嵌套在一个函数作用域(greet
函数)中,最外层作用域是全局作用域。
🚁 词法作用域:代码的时光机器
词法作用域(也叫静态作用域)从字面意义上看是说作用域在词法化阶段(通常是编译阶段)确定而非执行阶段确定的。形象一点来说就是,词法作用域就像是代码的时光机器,它在代码编写的时候就决定了变量在哪里被找到。这就像是你在写日记的时候,每个词语都记录下了当时的情感和环境。无论你在哪里调用函数,它都会回到过去,找到当初写下的内容,就像是读取你的时间旅行日记一样!
例子:
let number = 42;
function printNumber() {console.log(number);
}
function log() {let number = 54;printNumber();
}
// Prints 42
log();
上面代码可以看出无论printNumber()
在哪里调用console.log(number)
都会打印42
。动态作用域不同,console.log(number)
这行代码打印什么取决于函数printNumber()
在哪里调用。
如果是动态作用域,上面console.log(number)
这行代码就会打印54
。
使用词法作用域,我们可以仅仅看源代码就可以确定一个变量的作用范围,但如果是动态作用域,代码执行之前我们没法确定变量的作用范围。
像C,C++,Java,Javascript等大多数编程语言都支持静态作用域。Perl 既支持动态作用域也支持静态作用域。
🔗 作用域链:连接不同作用域的纽带
当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域。
如果在全局作用域里仍然找不到该变量,它就会在全局范围内隐式声明该变量(非严格模式下)或是直接报错。
例如:
let foo = 'foo';
function bar() {let baz = 'baz';// 打印 'baz'console.log(baz);// 打印 'foo'console.log(foo);number = 42;console.log(number); // 打印 42
}
bar();
当函数bar()
被调用,Javascript引擎首先在当前作用域下寻找变量baz
,然后寻找foo变量但发现在当前作用域下找不到,然后继续在外部作用域寻找找到了它(这里是在全局作用域找到的)。
然后将42
赋值给变量number
。Javascript引擎会在当前作用域以及外部作用域下一步步寻找number变量(没找到)。
如果是在非严格模式下,引擎会创建一个number
的全局变量并把42
赋值给它。但如果是严格模式下就会报错了。
结论:当使用一个变量的时候,Javascript引擎会循着作用域链一层一层往上找该变量,直到找到该变量为止。
结语
🌈🌈🌈通过本文的解释,我们详细了解了JavaScript中的作用域与作用域链。希望你在通俗易懂的语言和生动的例子中,更好地理解了这些概念。作用域和作用域链是编程的基础,是你进入JavaScript世界的钥匙。相信你已经准备好在编程的大海中翱翔了!
如果你觉得本文对你有帮助,不妨点赞并分享给你的朋友们。让我们一同扬帆,启程探索编程的未知领域吧!🎉🎉🎉
相关文章:
【前端|Javascript第3篇】探秘JavaScript的作用域与作用域链:小白也能轻松搞懂!
大家好!欢迎来到本篇博客,今天我们将解开JavaScript编程世界中的一道神秘面纱:作用域与作用域链。很多Javascript开发者并不真正理解它们,但这些概念对掌握Javascript至关重要。如果你对这些概念感到困惑,不要担心&…...
【Spring AOP】结合日志面向切面编程 两种写法
概念 这里需要提前了解什么是Spring的AOP(Aspect Oriented Programming)。是在OOP(面向对象)思想的一种拓展思想。简单来说就是将某个代码块嵌入到其它的代码块中。笔者先前学Spring也有学什么IoC啊AOP啊,但实际上没有…...
C#在自动化领域的应用前景与潜力
人机界面(HMI)开发:使用C#开发人机界面软件,实现与自动化设备的交互和监控。C#的图形界面设计能力和丰富的控件库使得开发人员能够创建直观、易用的界面。 数据采集与处理:C#可以与各种传感器、设备进行数据通信和采集…...
string模拟实现:
string模拟实现: 上一篇博客,我们对String类有了一个基本的认识,本篇博客我们来从0~1去模拟实现一个String类,当然我们实现的都是一些常用的接口。 ❓我们这里定义了一个string类型,然后STL标准库里面也有string&#…...
系统与软件安全研究(八)
FUZZ101入门 Detail gcc,clang,llvm都有啥区别GCC (GNU Compiler Collection), Clang, 和 LLVM 都是用于编译代码的工具链。它们在某些方面有相似之处,但也有一些重要的区别。 GCC (GNU Compiler Collection):GCC 是由 GNU 组织开发的,是一个非常流行的开源编译器集合。它…...
jmeter测试rpc接口-使用dubbo框架调用【杭州多测师_王sir】
1.基于SOAP架构。基于XML规范。基于WebService协议。特点:接口地址?wsdl结尾2.基于RPC架构,基于dubbo协议,thrift协议。SpringCloud微服务。3.基于RestFul架构,基于json规范。基于http协议(我们常用的都是这种,cms平台也是) Rest…...
Java8中forEach()里使用return的效果
先总结:使用forEach()处理集合时不能使用break和continue这两个方法,可以使用无返回值的return跳出此次循环,效果同标准for循环的continue。 首先,forEach()先对入参判空,然后使用增强for循环调用action.accept(t)&am…...
MVC配置原理
如果你想保存springboot的mvc配置并且还想自己添加自己的配置就用这个。 视图解析器原理,它会从IOC容器里获取配置好视图解析器的配置类里的视图解析器集合, 然后遍历集合,生成一个一个的视图对象,放入候选 视图里,…...
rabbitmq安装
安装erlang方案二 vi /etc/yum.repos.d/rabbitmq-erlang.repo 文件内容: In /etc/yum.repos.d/rabbitmq-erlang.repo [rabbitmq-erlang] namerabbitmq-erlang baseurlhttps://dl.bintray.com/rabbitmq-erlang/rpm/erlang/22/el/7 gpgcheck1 gpgkeyhttps://dl.bi…...
轻松抓取网页内容!API助力开发者,快速数据采集
在如今这个信息爆炸的时代,人们需要从各种渠道获取数据来支持自己的业务需求。而对于开发者们来说,如何快速、准确地从互联网上抓取所需的数据也成为了一项重要的技能。而抓取网页内容 API 则是一种能够帮助开发者轻松实现数据抓取的工具。 一、什么是抓…...
CSDN 直播:腾讯云大数据 ES 结合 AI 大模型与向量检索的新一代云端检索分析引擎 8月-8号 19:00-20:30
本次沙龙围绕腾讯云大数据ES产品展开,重点介绍了腾讯云ES自研的存算分离技术,以及能与AI大模型和文本搜索深度结合的高性能向量检索能力。同时,本次沙龙还将为我们全方位介绍腾讯云ES重磅推出的Elasticsearch Serverless服务,期待…...
区块链智能合约代码示例
以下是一个简单的区块链智能合约代码示例: pragma solidity ^0.4.17;contract SimpleContract {uint public myData;function setMyData(uint newData) public {myData newData;} }该合约具有以下功能: 定义了一个名为 SimpleContract 的合约。定义了一…...
Spring Boot介绍--快速入门--约定优于配置
文章目录 SpringBoot 基本介绍官方文档Spring Boot 是什么?SpringBoot 快速入门需求/图解说明完成步骤快速入门小结 Spring SpringMVC SpringBoot 的关系总结梳理关系如何理解-约定优于配置 SpringBoot 基本介绍 官方文档 官网: https://spring.io/projects/spring-boot 学习…...
Scons编译lib库
实例目录结构: include文件夹:test.hsrc文件夹:test.cSConscriptSConstruct 如下图所示: SConstruct: #执行当前目录下的SConscript SConscript(SConscript);SConscript: import os from SCons.Script…...
React源码解析18(1)------ React.createElement 和 jsx
1.React.createElement 我们知道在React17版本之前,我们在项目中是一定需要引入react的。 import React from “react” 即便我们有时候没有使用到React,也需要引入。原因是什么呢? 在React项目中,如果我们使用了模板语法JSX&am…...
系列3-常见的高可用MySQL解决方案
高可用主要解决两个问题,如何实现数据共享和同步数据、如何处理failover,数据共享的解决方案一般是SAN,数据同步通过rsync和drbd技术来实现。 1、主从复制解决方案 这是MySQL自身的高可用解决方案,数据同步方法采用的是MySQL rep…...
C#登录后携带cookie爬取数据
前一段时间,公司以前的一个数据采集任务突然之间采集下来的数据都是0了,也就是未登录状态能够获取到的数据,于是猜想肯定是网站的服务升级了,升级了数据接口的逻辑,于是便开始解决此问题。 此采集程序是由.net core开…...
自动驾驶国家新一代人工智能开放创新平台产业化应用
【摘要】:当前,全球新一轮科技革命和产业变革正孕育兴起,自动驾驶作为人工智能最重要的应用载体之一,对于加快交通强国、智能汽车强国建设,具有十分突出的战略意义。我国自动驾驶研发应用,面临技术、资金、应用等诸多挑战,为此,需要打造一套符合我国国情的自动驾驶系统…...
Maven分模块-继承-聚合-私服的高级用法
Maven分模块-继承-聚合-私服的高级用法 JavaWeb知识,介绍Maven的高级用法!!! 文章目录 Maven分模块-继承-聚合-私服的高级用法1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承…...
Spring 是如何解决循环依赖问题的?
项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道,如果在代码中,将两个…...
Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发
今日目标 掌握纯注解开发依赖注入(DI)模式 学习使用纯注解进行第三方Bean注入 1 注解开发依赖注入(DI)【重点】 问题导入 思考:如何使用注解方式将Bean对象注入到类中 1.1 使用Autowired注解开启自动装配模式(按类型) Service public class StudentS…...
java 强密码验证策略工具类
java 强密码验证策略工具类 package com.neusoft.caeid.common.utils;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author dume*/ public class PasswordUtil {public static final String REGEX "^\\S*(?\\S{6,})(?\\S*\\d)(?\\S*[a-zA-Z…...
CI/CD—K8S 基本理解与部署
1 K8S 是什么 Kubernetes 是一款容器的编排调度工具,来源于 Google 开源的 Brog 系统。Kubernetes简称K8S,是用8代替8个字符 “ubernete” 而成的缩写,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化…...
2023网络安全常用工具汇总(附学习资料+工具安装包)
几十年来,攻击方、白帽和安全从业者的工具不断演进,成为网络安全长河中最具技术特色的灯塔,并在一定程度上左右着网络安全产业发展和演进的方向,成为不可或缺的关键要素之一。 话不多说,网络安全10款常用工具如下 1、…...
OpenStack监控工具
OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。由NASA和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证)授权。 OpenStack为私有云和公有云提供可扩展的弹性的云计算…...
讲解密码学综合应用
密码学综合应用是指将密码学的理论和技术应用于各种场景中,以保障信息的安全性、完整性和可靠性。密码学的应用范围非常广泛,包括通信安全、网络安全、电子商务、数字签名、认证、密钥管理等。下面将简要介绍一些密码学综合应用的实例: 1. 加…...
Flamingo
基于已有的图像模型和文本模型构建多模态模型。输入是图像、视频和文本,输出是文本。 Vision encoder来自预训练的NormalizerFree ResNet (NFNet),之后经过图文对比损失学习。图片经过图像模型的输出是2D grid,视频按1FPS的频率采样后经过图…...
Leetcode-每日一题【剑指 Offer 12. 矩阵中的路径】
题目 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 例如,在下面的 34 的矩阵中包含单词 "ABCCED"(单词中的字母…...
安全渗透知识总结二
目录 一、html实体编码 1、Unicode字符编码 2、字符的数字表示 3、常见实体编码 4、url 协议 主机 http状态码 http常用的状态码 端口 常见协议端口 查询参数 锚点 url字符 urlcode字符 绝对url和相对url 二、字符编码 Ascll字符集 html字符集 html的url编码 …...
【线程】wait()+notifyAll()实现多个线程交替遍历,输出ABCABC
背景 有三个线程,每个线程分别循环输出A、B、C,各线程循环10次,要求输出结果是ABCABCABC这样的 代码 Data public class PrintThread extends Thread {private String string; // 输出的字符串private int order; …...
免费的ppt网站推荐/视频网站推广
在使用spring创建bean的时候需要在指定bean的生命周期,bean的声明周期有一下几种: singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例prototype表示每次获得bean都会生成一个新的对象request表示在一次http请…...
组服务器做网站/seo排名公司
一、码云链接 项目名称FAO 码云链接 二、需求分析 实现一个命令行程序;自动生成小学四则运算题目(加、减、乘、除)支持整数支持多运算符(比如生成包含100个运算符的题目)支持真分数统计正确率三、设计思路 首先设计一个基础的数据类ÿ…...
潍坊做网站建设/网络营销的实现方式包括
2019独角兽企业重金招聘Python工程师标准>>> http://www.yiibai.com/python/python_quick_guide.html 转载于:https://my.oschina.net/u/200350/blog/885930...
快速网站建设推荐/网站推广方案有哪些
css预处理器的概念首次成为前端web开发工作流程的主流并改变了我们编写css的方式css预处理器他是一种工具,用于通过自己的脚本语言扩展默认普通css的基本功能,它可以帮助我们使用复杂的逻辑语法,像我们的变量,函数,混合…...
114网站做推广怎么样/百度seo白皮书
第三方验收测试 第三方验收测试-验收测试服务-UAT测试-网站测试报告-Alltesting泽众云测试www.alltesting.cn/jsp/newVersion2/bigNews/testService/check-test.jsp 第三方验收测试是公正、客观地评估系统功能、性能、安全等质量特性与需求规格说明书是否一致的过程࿰…...
90设计网兼职/成都seo公司排名
防水连接器是目前市场上应用比较多的一种连接插头,主要用于保证在遇到水时提供安全可靠的连接,不至于因为遇到水产生短路等故障。防水连接器在很多产品上都有应用,如LED灯具、灯塔、监控摄像头、电动汽车等,都需要用到这种产品。那…...