JS作用域、作用域链、运行期上下文

本文详细解析了JavaScript中的作用域概念,包括全局作用域、局部作用域、块级作用域等,并介绍了如何通过作用域链查找变量。此外,还探讨了函数执行时创建的运行期上下文及其对作用域的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用域(全局、局部——函数作用域、块级作用域ES6)

定义:变量(变量作用域又称上下文)和函数生效(能被访问)的区域;每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存、取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。

作用域链

[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链。

查找变量:从作用域链的顶端依次向下查找

运行期上下文

运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,执行上下文被销毁。

代码详解

    function a(){
        function b(){
            var bbb = 234;
            console.log(aaa);
        }
        var aaa = 123;
    }
    var glob = 100;
    a();

具体过程
1. a被定义时
在这里插入图片描述
2. a函数执行时,同时b被创建(两个部分)
a执行(继承GO,作用域链产生)
在这里插入图片描述
b继承a的AO
在这里插入图片描述
3.b函数执行时
在这里插入图片描述

### JavaScript 作用域的概念 #### 什么是作用域作用域一个程序源代码中定义变量的区域,它决定了某个命名空间可以被访问以及其可见性。在 JavaScript 中,作用域控制着变量和函数的可访问范围[^2]。 #### 作用域的分类 JavaScript 的作用域主要分为两种:全局作用域和局部作用域(也称为函数作用域或块级作用域)。 - **全局作用域**:当变量声明在任何函数外部,该变量属于全局作用域,可以在整个程序中访问。如果找不到变量所在的特定作用域,则会尝试从全局作用域中获取该变量[^3]。 - **局部作用域**:当变量声明在一个函数内部,它们仅限于该函数作用域内可用。现代 JavaScript 推荐使用 `let` 或 `const` 来声明变量,这使得变量具有块级作用域,从而减少了因变量提升而导致的潜在错误。 #### 执行上下文作用域链 每当一段 JavaScript 代码被执行,都会进入一个执行上下文中。这个上下文包含了当前正在执行的代码的相关信息。每个执行上下文都有三个重要组成部分:变量对象、作用域链和 this 绑定[^1]。 - **作用域链**:JS 引擎通过作用域链来解析变量名。例如,当调用嵌套函数,引擎会在当前函数作用域中寻找所需变量;如果没有找到,则继续在外层父函数作用域中查找,直到到达全局作用域为止。如果仍然未找到,则可能抛出 ReferenceError 错误。 #### [[Scope]] 属性 每一个 JavaScript 函数实际上都是一个对象,而这些对象具有一些特殊的属性供 JavaScript 引擎使用,其中之一便是 `[[Scope]]`。此属性保存了一个数组形式的运行期上下文集合,表示的是该函数创建所在的作用域环境。换句话说,`[[Scope]]` 定义了哪些变量能够在这个函数体内被访问到[^4]。 ```javascript function outerFunction() { var a = 'outer'; function innerFunction() { var b = 'inner'; console.log(a); // 可以访问外层作用域中的a console.log(b); } return innerFunction; } var fn = outerFunction(); fn(); // 输出 'outer' 和 'inner' ``` 上述例子展示了如何利用闭包机制保持对外部作用域变量的引用关系。 --- ### 总结 理解 JavaScript 的作用域对于开发人员来说非常重要,因为它直接影响到了我们的编程方式及其性能表现。合理运用不同的作用域可以帮助我们构建更加清晰、安全的应用程序架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值