【从头学前端】10-JavaScript中的作用域

Hello 大家好,我是彼岸繁華🌸,一个坚信努力可以改变命运的前端👨🏻‍💻,如果有幸写的文章可以得到你的青睐,万分有幸~

编写不易转载请获得允许

写在前面

本篇文章我们将来学习JavaScript中的作用域。通过本篇文章的学习可以掌握什么知识呢?如下图:

01_导读.png

什么是作用域

JavaScript中的作用域 (scope ),就是指变量、函数或者对象的可访问范围 。也就是说,作用域控制着变量、函数或者对象的可见性和生命周期。

可访问范围

所谓的可访问范围 ,就是指某个变量、函数或者对象在一个特定的执行环境中可以被访问,但一旦超出这个执行环境就无法被访问。例如每一个函数都有自己的执行环境,也就是说,在一个函数中如果声明一个变量的话,就只能在该函数才能访问。

示例代码如下:

function func () {
    var v = 100; // 我是函数中的变量
    console.log(v) // 打印变量v
}
// 在函数体外访问变量 v
console.log(v) // 抛出异常: v is not defined

生命周期

所谓的生命周期,就是指某个变量、函数或者对象从被创建到被销毁的过程。如果以变量为例的话,一般情况下,声明变量就是变量的生命周期的开始,而当前执行环境中所有代码全部执行完毕之后,也就是变量被销毁的时候。

想要验证一个变量的生命周期,我们可以通过断点调试代码的方式来验证。如下图所示

02_生命周期.gif

我们可以看到当代码执行到func函数的函数体中的第一行,也就是说,声明变量v这条语句时(代码停止在这一条语句,表示该条语句还没有执行 )。在local 中已经创建的v变量,但值为undefined 是因为该条语句还没有执行,然后进行赋值操作,这个函数体执行完毕之后,变量v也就消失了,也就是一个生命周期结束了。

作用域的分类

JavaScript中的作用域可以根据执行环境的不同可以分为以下两种:

  • 全局作用域:指的是所有函数外部的执行环境。在全局作用域定义的变量、函数或者对象在任意位置都可以访问。

  • 局部作用域:指的是某一个函数内部或者代码块的内部的执行环境。在函数内部或者代码块的内部定义的变量、函数或者对象只能在当前函数内部或者代码块的内部访问。

注意:ECMASCript6才有了块级作用域的概念,我们现在讨论的是ECMAScript5以及之前的版本中的作用域。

变量作用域

全局变量

在ECMAScript5以及之前的版本中,全局变量指的就是那些声明在所有函数的函数体外部的变量。全局变量是允许在 JavaScript 代码的任意位置都可以访问到的。

示例代码如下:

var v = 100; // 定义全局变量
console.log(v) // 访问变量 v
function fun () {
    console.log(v) // 在局部作用域中访问全局变量 v
}
fun() // 100

局部变量

在ECMAScript5以及之前的版本中,局部变量指的就是那些声明在某个函数内部的变量。局部变量只能在当前函数作用域中访问,在当前函数作用域外(无论是全局作用域还是其他函数作用域)都是无法访问的。

示例代码

示例代码如下:

function func () {
    var v = 100; // 定义局部变量
    console.log(v)  // 访问局部变量
}
func()
console.log(v) // 在函数体外访问局部变量。。抛出异常:v is not defined
function fun () {
    console.log(v) // 在其他函数中访问局部变量。。抛出异常:v is not defined
}
fun()

函数作用域

全局函数

在ECMAScript5以及之前的版本中,所谓的全局函数,就是声明在全局作用域中的函数,这个函数是允许在JavaScript代码的任意位置访问的函数。

示例代码如下:

function fun () {  // 声明且初始化
    console.log('我是fun函数')
}
// 调用全局函数
fun()  // 我是fun函数
function fn () {
    fun() // 在fn函数体中访问全局函数
}
fn()  // 我是fun函数

局部函数

局部函数又称内部函数,指的就是那些声明在某个函数内部的函数。内部函数只能在当前函数作用域中访问,在当前函数作用域外(无论是全局作用域还是其他函数作用域 )都是无法访问的。

示例代码如下:

function fun () {  // 声明且初始化
    function fn () {
        console.log('我是fn函数')
    }
    fn()  // 我是fn函数
}
// 调用全局函数
fun()  // 我是fn函数
function f () {
    fn() // 在f函数体中访问内部函数
}
  // f()  // 抛出异常

总结

03_总结.png

预告:下一篇文章我们将来学习JavaScript中的对象

精彩文章

【从头学前端】09-JavaScript中的函数(全是基础,看看你都会吗)

【从头学前端】08-JavaScript中的数组的基础知识,可能有你不知道的

【从头学前端】07-掌握JavaScript中的循环语句

【从头学前端】06-这次我学会了JavaScript中的条件语句

【从头学前端】05-详解JavaScript中的35种运算符

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗周.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值