返回
作用域和作用域链通俗解读
前端
2024-02-21 01:19:58
<h1>作用域和作用域链</h1>
前言
之前写博客,经常需要引用一些基础的内容,每次都花不少时间找合适的文章,索性花点时间自己写,也当是巩固下基础。于是有了这个系列(JS核心基础)的文章。
目前已经完成的文章:
* js从编译到执行过程
<h2>作用域</h2>
作用域是javascript中一个重要的概念,在JS中可以理解为变量声明后拥有它的执行空间,即其生命周期。根据变量生命周期的不同,作用域可分为全局作用域和局部作用域。
* **全局作用域** :是指在整个程序中都可访问的变量,通常是通过var来声明的。全局作用域中的变量可以在任何地方被访问,但是不能在函数内部被重新声明,否则会导致变量提升。
* **局部作用域** :是指在一个特定块或函数中声明的变量,在块或函数外无法访问。局部作用域中的变量可以使用let、const或var关键字来声明,但是不能在同一块或函数中重新声明,否则会导致变量提升。
<h2>作用域链</h2>
作用域链是一个有序的变量对象列表,它决定了在某个特定作用域中可以访问哪些变量。作用域链是从当前作用域开始,一直向上直到全局作用域。
作用域链的查找过程如下:
1. 在当前作用域中查找变量,如果找到,则返回该变量。
2. 如果没有找到,则在父作用域中查找变量,以此类推,直到找到全局作用域。
3. 如果在全局作用域中也没有找到,则变量不存在。
<h2>变量提升</h2>
变量提升是指在JavaScript中,变量和函数的声明会被提升到其所在作用域的顶部。这意味着,变量和函数可以在声明之前使用,但是不能在赋值之前使用。
变量提升只适用于var声明的变量,let和const声明的变量不会被提升。
<h2>变量赋值</h2>
变量赋值是指将一个值赋给一个变量。在JavaScript中,变量赋值可以使用=运算符。
变量赋值的过程如下:
1. 创建一个新的变量或获取一个已有的变量。
2. 将一个值赋给该变量。
变量赋值可以随时进行,但是不能在变量声明之前进行。
<h2>闭包</h2>
闭包是指可以访问其他作用域变量的函数。在JavaScript中,闭包可以通过在函数内部声明一个变量来实现。
闭包可以用来实现一些特殊的功能,例如:
* 私有变量:闭包可以用来创建私有变量,这些变量只能在闭包内部访问。
* 函数柯里化:闭包可以用来实现函数柯里化,即把一个多参数函数转换成一个单参数函数。
* 事件处理:闭包可以用来实现事件处理,即当某个事件发生时执行某个函数。
## 总结
作用域是JavaScript中一个重要的概念,它决定了变量的可见性。作用域链是一个有序的变量对象列表,它决定了在某个特定作用域中可以访问哪些变量。变量提升是指在JavaScript中,变量和函数的声明会被提升到其所在作用域的顶部。变量赋值是指将一个值赋给一个变量。闭包是指可以访问其他作用域变量的函数。
希望这篇文章对您有所帮助。如果您有任何问题,请随时留言。