前端技巧第十期JavaScript作用域链

【前端知识之JS】JS的作用域链 本系列主要整理前端面试中需要掌握的知识点。本节介绍JS的作用域链。 阅读详情

作用域决定了变量、函数和对象的可访问范围,是JavaScript最基础的核心机制

一、作用域类型

全局作用域:脚本最外层声明的变量
const globalVar = '全局变量';
function test() {  
	console.log(globalVar); 
	// 可访问
}
函数作用域:通过var或函数声明创建
function funcScope() {  
	var funcVar = '函数内部变量';  
	console.log(funcVar); 
	// 正常输出
}
console.log(funcVar); // ReferenceError
块级作用域(ES6+):通过let/const创建
if (true) {  
	let blockVar = '块级变量';  
	const PI = 3.14;
}
if (true) {  let blockVar = '块级变量';  const PI = 3.14;}

二、作用域链:变量的寻址导航系统

访问变量时,JavaScript会沿着作用域链逐级向上查找
1. 链式结构形成原理
let global = 'G';
function outer() {
	let outerVar = 'O';
	function inner() {
		let innerVar = 'I';
		console.log(innerVar);    // I(当前作用域)
		console.log(outerVar);    // O(父级作用域)
		console.log(global);      // G(全局作用域)
	}
	inner();
}
outer();
inner作用域 → outer作用域 → 全局作用域 → null
2. 关键特性
静态词法作用域:链的链接关系在代码编写阶段确定
单向访问:内部作用域可访问外部,反之不行
遮蔽效应:同名变量会覆盖外层定义
let x = 10;
function shadowDemo() {
	let x = 20; // 遮蔽全局x
	console.log(x); // 20
}

三、执行上下文与作用域链的关系

每次函数调用都会创建新的执行上下文,其包含三个核心部分:
1:变量环境(Variable Environment)
2:词法环境(Lexical Environment)
3:this绑定
// 作用域链的物理实现:
ExecutionContext = {
	VariableEnvironment: { /* var变量 */ },
	LexicalEnvironment: {
		 outer: <父级词法环境引用>, // 构成作用域链的关键
		    /* let/const变量 */
	},
	ThisBinding: <this值>
}

四、闭包:作用域链的经典应用

1: 闭包的本质是函数与其词法环境的引用捆绑。
function createCounter() {
	let count = 0;
	return {
	  increment: () => { count++; },
	  getValue: () => count
	};
}
const counter = createCounter();
const counter = createCounter();
console.log(counter.getValue()); // 1
2.:闭包的应用场景
模块化开发(私有变量封装)
防抖/节流函数
缓存计算结果
循环中正确处理异步回调

五、常见问题

1. 循环变量陷阱(经典面试题)
for (var i = 0; i < 3; i++) {  
	setTimeout(() => {    
		console.log(i); // 输出3次3  
	}, 100);
}
// 解决方案:使用IIFE或let
for (let i = 0; i < 3; i++) {  
	setTimeout(() => {    
	console.log(i); // 0,1,2  
	}, 100)
}
2. 变量提升的坑
console.log(a); // undefined(变量提升)
var a = 10;
console.log(b); // ReferenceError(暂时性死区)
let b = 20;
3. 严格模式的影响
'use strict';
function strictDemo() {  
	undeclaredVar = 10; // 抛出ReferenceError
}

七、思考

尽可能最小化全局变量:使用IIFE封装代码
优先使用const/let:避免变量提升问题
合理使用闭包:注意内存泄漏风险
模块化开发:使用ES6 Module管理作用域
命名空间模式:减少全局污染
Protege入门指南:从下载到本体构建实战 本文是Protege的入门实战指南,详细介绍了如何从官网下载安装这款由斯坦福大学开发的免费本体构建工具,并通过经典的“披萨本体”案例,系统讲解了类、属性、个体和公理四大核心要素。文章还深入解析了Protege的工作界面,并引导读者亲手创建一个简易的“公司人员组织”本体,完成从定义概念、建立关系到逻辑推理的全流程,是知识图谱与本体建模初学者的理想教程。 阅读详情

相关推荐

不只是烧录:深入理解英飞凌Aurix MCU的HSM安全模块与UDE Memtool解锁操作

本文深入探讨了英飞凌Aurix MCU的HSM安全模块设计与UDE Memtool解锁操作,揭示了硬件安全模块的架构、安全启动链机制及调试接口的安全特性。通过分析UDE Memtool的解锁逻辑和量产环境下的最佳实践,帮助工程师更好地应对MCU锁定问题,提升汽车电子和工业控制领域的安全烧录效率。

weixin_32770423的博客 300

【全网最好懂】图解 前端作用域、作用域链

全网最好懂的图解前端作用域、作用域链。

qq_69223185的博客 569

一文入门BMS(电池管理系统)

本文章是基于曾师兄的文稿《具有组网扩展功能的新能源汽车电池管理系统》而写的文章。该文章主要是对BMS(Battery Management System,电池管理系统)做一些简要的介绍,借此助各位也助我入门BMS。有纰漏请指出,转载请说明。学习交流请发邮件 1280253714@qq.com。

weixin_45817947的博客 2万+

前端JavaScript篇之对作用域、作用域链的理解

全局作用域是在整个代码中都可以访问的作用域。在全局作用域中声明的变量和函数可以在代码的任何位置被访问。

星辰迷上大海的博客 2173

CTFshow-pwn入门-前置基础pwn32-pwn34

CTFshow-pwn入门-前置基础pwn32-pwn34

你们de4月天的博客 1132

oracle p6 破解版下载,Primavera P6项目管理软件 16~17 图文详细安装教程(附下载)

Primavera P6 Professional项目管理软件结合了Oracle和Microsoft SQL Server关系数据库,是一款非常好用且功能强大的综合的项目管理软件(PPM) 解决方案,主要用于土建等方面的施工计划分析,具有进度时间安排与资源控制功能的多用户、多项目系统,支持多层项目分层结构、角色与技能导向的资源安排、记录实际数据、自定义视图以及自定义数据,本文主要为大家图文详细介绍...

weixin_33978451的博客 4920

【前端】作用域和作用域链

Javascript

weixin_44804745的博客 415

从零到一:在K210上实现YOLO模型在线训练与部署全流程

本文详细介绍了在K210芯片上实现YOLO模型在线训练与部署的全流程,涵盖数据采集、模型优化、量化转换及内存管理等关键环节。通过实战案例和代码示例,帮助开发者高效利用K210的超低功耗特性与YOLO模型的实时检测能力,适用于边缘计算和物联网应用场景。

weixin_29094539的博客 350

前端面试必会 | 一文读懂 JavaScript 中的作用域和作用域链

本文翻译自 https://blog.bitsrc.io/understanding-scope-and-scope-chain-in-javascript-f6637978cf53,作...

止水聊技术 482

【有啥问啥】智能座舱CPD技术:毫米波雷达如何守护儿童安全?

本文深入探讨了智能座舱中CPD(Child Presence Detection)技术如何通过毫米波雷达保障儿童安全。毫米波雷达凭借其穿透性检测、微动感知等优势,成为儿童遗留车内的有效解决方案。文章详细解析了技术原理、系统集成方案及安装指南,为智能座舱安全技术提供了实用参考。

weixin_29193259的博客 358

基于卷积神经网络CNN实现电力负荷多变量时序预测(PyTorch版)

随着智能电网的发展,精准的电力负荷预测对能源调度和电网稳定具有重要意义。本文基于PyTorch框架,提出一种基于卷积神经网络(CNN)的多变量时间序列预测模型,用于电力负荷的短期预测。

时序笔记 988

【前端面试之JS】什么是作用域链、原型链

什么是作用域链、原型链

阿卡内的博客 514

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 115

从零开始讲解JavaScript中作用域链的概念及用途

从零开始讲解JavaScript中作用域链的概念及用途引言正文一、执行环境二、作用域链 引言 之前我写过一篇关于JavaScript中的对象的一篇文章,里面也提到了作用域链的概念,相信大家对这个概念还是没有很深的理解,并且这个概念也是面试中经常问到的,因为这个概念实在太重要了,在我们平时写代码时,也可能会因为作用域链的问题,而出现莫名其妙的bug,导致我们花费大量的时间都查找不出原因。所以我就准备单独写一篇关于作用域链的文章,来帮大家更好地理解这个概念。 正文 一、执行环境 首先,我们要引入一个概念,叫做执

零一的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【前端】JavaScript作用域链机制详解

通过本文对 JavaScript 中作用域链的深入探讨,我们了解了作用域链的形成机制、变量查找顺序以及嵌套函数中的作用域链表现。代码示例展示了如何通过作用域链实现变量的访问,以及如何处理嵌套函数中的变量遮蔽问题。作用域链是 JavaScript 语言的核心特性之一,它直接影响了变量的可访问性和函数的执行行为。 掌握作用域链能够帮助开发者更好地理解 JavaScript 的变量查找机制、闭包以及函数嵌套的行为逻辑。 2024.11.25-✍

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1639

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

前端js作用域链

本文介绍了JavaScript中的作用域和作用域链概念。作用域分为全局作用域(所有代码可访问)和局部作用域(函数/代码块内有效)。作用域链是变量查找路径:从当前作用域开始,依次向上查找父级作用域,直至全局作用域。文章通过家居比喻和代码示例说明变量查找过程,并指出局部变量会遮蔽同名全局变量,未定义变量会导致报错。作用域链机制决定了变量的可访问范围,是理解JavaScript变量查找的基础。

m0_63779088的博客 746

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JavaScript中的作用域链详解

题外话:最近面试一直被问到作用域链的问题,所以还是要深入透彻的学习一下这两个概念。作用域链在红宝书中对作用域链的描述有这么一段话:当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象在最开始时只包含一个变量,即argume

charlene0824的博客 1万+

JavaScript中的作用域链

作用域(Scope)是指变量或函数在其定义范围内可以被访问的区域。全局作用域:在全局环境中声明的变量和函数属于全局作用域,可以在整个程序的任何地方访问。函数作用域:在函数内部声明的变量和函数属于函数作用域,只能在该函数及其嵌套的函数内部访问。块级作用域:从ES6开始引入,在{}花括号内定义的变量(使用let或const)属于块级作用域,仅限于该块内部有效。作用域链是由多个作用域按顺序连接而成的链条,用于确定变量的查找路径。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 937

javascript作用域链详解

今天我们来看看js作用域链,我们先带着一个疑问去看后面的内容。什么疑问呢,我们都知道的一个常识是,一个函数内,我们可以访问这个函数外的变量,或者可以访问全局变量,但是有没有想过,他为什么可以访问啊。而且,当函数外和函数内都定义了一个相同变量时,为什么只取函数内的变量,而不取函数外的呢。javascript到底是怎么处理的呢。带着这个疑问,我们来看下面的文章 要理解作用域链,首先我们得理解几个概念 执行环境:javascript代码执行所处得环境,他定义了环境内变量及函数所能访问的其他数据(包括外部数据.

weixin_42707287的博客 2016

JavaScript中的作用域链(scope chain)

JavaScript中的作用域链(scope chain)

商务合作欢迎私信我 1万+

JavaScript中的作用域链增强:你真的了解吗?

在JavaScript开发中,作用域链是理解变量查找机制的核心概念之一。然而,作用域链并非一成不变,它可以通过特定语法在运行时动态“增强”。这种增强机制在某些场景下非常有用,但也可能带来意想不到的副作用。本文将深入浅出地讲解JavaScript中的**作用域链增强**,并探讨其背后的原理与最佳实践。

JakeMa1024的博客 1388

【JavaScript】深入理解作用域链

在 JavaScript 中,作用域(Scope)是指变量和函数的可访问范围。根据变量的定义方式,它们可以在不同的作用域中访问。在 ES6 之前,JavaScript 只有两种作用域:全局作用域和函数作用域。随着 ES6 的引入,块级作用域也成为一种重要的作用域类型。全局作用域:在程序的任何地方都可以访问的变量或函数。函数作用域:在函数内部定义的变量和函数,只能在该函数内部访问。块级作用域:在代码块{}内定义的变量,只能在该块内访问。作用域链是 JavaScript 引擎用来解析变量的机制。

lph159的博客 1512

JavaScript中的作用域及作用域链

一、作用域 概念:变量和函数的可访问范围,控制着变量和函数的可见性与生命周期变量的作用范围 1、全局作用域(全局变量):在函数外部定义的变量或在函数内部没有使用var声明的变量。在浏览器页面没有关闭之前一直占用内存空间。比较耗费内存。在浏览器页面关闭时才释放内存 2、局部作用域(局部变量):在函数内部用var关键字定义的变量。只在函数内部起作用,函数调用结束后,局部变量所占的内存就会被释放。 var a=3; //全局变量 function fn(b){ //局部变量 .

m0_46420078的博客 2817

JS基础之作用域链

JS基础之作用域链

weixin_45364386的博客 1026

JavaScript中的作用域链和闭包

作用域 全局作用域局部作用域 作用域链执行上下文活动对象闭包闭包优化         JavaScript中出现了一个以前没学过的概念——闭包。何为闭包?从表面理解即封闭的包,与作用域有关。所以,说闭包以前先说说作用域。 作用域(scope)         通常来说一段程序代码中使用的变量和函数并不总是可用的,限定其可用性的范围即作用域,作用域的使用提高了程序逻辑的局部性,增强

李达 8427

JavaScript 前端面试 4(作用域链、this)

this关键字是函数运行时自动生成的一个内部对象,只能在函数内部使用,总指向它的对象this在函数执行过程中,this一旦被确定了就不可以再更改了。

weixin_67480430的博客 2229
上一篇: 前端技巧第九期JavaScript数据类型
下一篇: ??= 操作符
everyStudy
博客等级 码龄4年 292粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值