前端学习第60天
JavaScript 进阶
1. 作用域
作用域:变量能够被访问的“范围”,“范围”外变量不能被访问
1.1 局部作用域
局部作用域分为函数作用域
和块作用域
1. 函数作用域:
在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
<script>
function getSum() {
const num = 10
}
// console.log(num) //此处错误,无法调用局部作用域
</script>
总结:
- 函数内部声明的变量,在函数外部无法直接被访问
- 函数的参数也是函数内部的局部变量
- 不同函数内部声明的变量无法直接访问
- 函数执行完毕后,函数内部的变量实际被清空了
2. 块作用域:
在JavaScript中使用{}包裹的代码被称为代码块,代码块内部声明的变量外部将有可能
无法被访问
for (let i = 0; i <= 5; i++) {
//块作用域
console.log(i);
}
// console.log(i)//此处错误,无法调用局部作用域.超出了i的作用域
总结:
- let声明的变量会产生块作用域,var不会产生块作用域
- const声明的常量会产生块作用域
- 不同代码块之间的变量无法互相访问
- 推荐使用let或const
1.2 全局作用域
<script>
标签和.js文件最外层
就是全局作用域
全局作用域中声明的变量,任何其他作用域都可以被访问
<script>
// 全局作用域下声明num变量
const num = 10
function fn(){
// 函数内部可以使用全局作用域的
console.log(num)
}
</script>
注意:
- 为window对象动态添加到属性默认也是全局的,不推荐!
- 函数中未使用任何关键字声明的变量为全局变量,不推荐!!!
- 尽可能少的声明全局变量,防止全局变量被污染
1.3 作用域链
作用域链本质上是底层的变量查找机制
- 在函数被执行时,会优先查找当前函数作用域中查找变量
- 如果当前作用域查找不到则会依次
逐级查找父级作用域
直到全局作用域
<script>
// 全局作用域
let a = 1
let b = 2
// 局部作用域
function f() {
let c
// let a = 10;
console.log(a) // 1 或 10
console.log(d) // 报错
// 局部作用域
function g() {
let d = 'yo'
// let b = 20;
console.log(b) // 2 或 20
}
// 调用 g 函数
g()
}
console.log(c) // 报错
console.log(d) // 报错
f();
</script>
总结:
- 嵌套关系的作用域串联起来形成了作用域链
- 相同作用域链中按着从小到大的规则查找变量
- 子作用域能够访问父作用域,父级作用域无法访问子级作用域
1.4 JS垃圾回收机制(GC)
JS中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收
不在用到 的内存,没有及时释放,叫内存泄漏
声明周期:JS环境中分配的内存,一般生命周期:内存分配——内存使用——内存回收
- 全局变量一般不会回收(关闭页面回收)
- 一般情况下局部变量的值,不用了,会被自动回收掉
常见浏览器回收算法:引用计数法和标记清除法
1.5 闭包
概念:内层函数中可以访问到其外层函数的作用域
闭包 = 内层函数 + 外层函数的变量
function outer() {
const a = 1
function f() {
console.log(a)
}
f()
}
outer()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!