小白如何快速学懂作用域-js篇

小白如何快速学懂作用域-js篇

你真的懂什么是声明提升吗? (作者也是初学者,分享自己的学习心得,求赞,轻喷)

什么是作用域

作用域指一个变量的作用范围。 在js中,作用域有 全局作用域函数作用域块级作用域。 还有一个特殊的作用域------欺骗词法作用域。

作用域

那么作用域是怎么产生的呢?首先我们在运行代码时,编译器引擎是需要先编译再执行我们的代码的。例如vscode,当我们需要运行一段代码时,V8引擎就会先对代码进行编译,找到有哪些有效标识符,然后再去执行代码语句。这时候作用域的区别就体现出来了。如下图:

V8开始编译,找到一个变量 a 和一个函数 foo(注意这时函数里的东西是暂时不用管的,编译只负责找到有效标识符)。这个时候开始执行,先生成了一个全局作用域 ,在全局作用域下开始执行第一行,把1赋给a,再来到第七行调用该函数 foo。那在执行函数时是不是又要先编译呢,于是'阿编'来到函数内,发现并没有有效标识符,那'阿执'要进来了,又生成了函数作用域 ,一看,只有一个打印的执行语句,要我们打印a的值,可是函数里并没有a。这里又有新的知识点,变量的查找会先从内到外的作用域中查找,不能从外到内

在函数作用域内没有找到变量a,再往外一层来到全局作用域,发现a的值是1。

我们再举个例子加深理解一下变量的查找

还和上面一样,编译找到变量 a 和函数 foo,生成全局作用域。执行第一行赋值语句,调用函数foo。来到函数内找到变量 a 和函数 bar。生成foo函数的作用域,执行第四行的赋值语句,第九行调用函数 bar。'阿编'又来到bar函数内,就这?啥也没有。'阿执':领域展开(bar函数的作用域-.-),需要打印a的值。先在自己作用域看看吧,没有,往外一层来到foo的作用域,发现a的值是2,完事。

全局作用域

写在script标签内的都是全局作用域

函数作用域

函数被调用的那一刻产生

块级作用域

  1. var 声明的变量存在声明提升,提升到当前作用域的顶端
  2. 函数声明会整体提升,提升到当前作用域的顶端
  3. let + {} 会形成块级作用域 const + {}也会

我们再来细细聊一下这个声明提升,用上面你学会的方法试着解析下面这段代码:

css 复制代码
console.log(a);
var a = 1

运行后你会发现我们这里输出的是undefined。这表示我们找到了变量a,但是它没有值。因为执行代码是从上往下执行的,你的打印代码在我赋值之前,可不就是没有值嘛。可是你又仔细一想,嗯~?(恭喜你,盲生,你发现了华点)我都没定义a,你凭什么就先访问到了a呢,你不是应该报错吗?------声明提升闪亮登场

因为声明提升,上面代码在执行时变成了这样:

css 复制代码
var a
console.log(a);
a = 1

同理,第2点也就很好解释了,不多比比。所以在编程时我们推荐使用 let 去声明变量。

let

  1. 不会声明提升
  2. 不能重复声明同一变量

const

  1. 不会声明提升
  2. 不能重复声明同一变量
  3. 声明的变量值不能被修改 (我们通常称之为常量)

欺骗词法作用域

  1. eval() 让原本不属于这里的代码加进来,变成就是这里写的代码
  2. with 当修改对象中不存在的属性时,该属性会泄露到全局成为全局变量

you should know:当你声明变量没有加关键字,不管你写在哪它都是全局变量。

以上没有过多解释的我们知道就行,毕竟咱是小白(主要我也解释不清-.-),在后续学习中我们会了解的。

相关推荐
多加点辣也没关系3 分钟前
JavaScript|第4章:类型转换
开发语言·javascript
yqcoder19 分钟前
httpOnly 是什么,又有什么用?
开发语言·前端·javascript
烬羽1 小时前
还在手动拼路径、写回调地狱?一文吃透 Node.js 的 path 和 fs
javascript·程序员·node.js
mONESY1 小时前
LangChain JS 高性能并行执行解析、工具调用底层封装
javascript
迅速的自行车2 小时前
从一段模板说起
前端·javascript·vue.js
YIAN2 小时前
LangChain JS 工具调用实战:基于 DeepSeek-V4-Flash 实现本地文件读取 AI 代码助手(完整可运行源码)
javascript·langchain·前端框架
尼斯湖皮皮怪2 小时前
iceCoder 记忆系统深度分析
前端·javascript
爸爸6193 小时前
07 ArkTS 基础类型与接口定义:从 TypeScript 到鸿蒙的类型升级
javascript·华为·typescript·harmonyos·鸿蒙系统
默_笙4 小时前
🌏 MCP 是 AI 界的 USB-C:一个协议让所有模型都能用上所有工具
前端·javascript
月光刺眼6 小时前
用LangChain 打造第一个 Agent:LLM 大脑与 Tool 手脚的完整闭环
javascript·人工智能·全栈