【作用域与作用域链】js基础篇

MDN的解释是:

当前的执行上下文。

一.前言

        首先作用域的英文就是scopes,在js中是函数的一个私有属性【【scopes】】,这个私有属性就储存着所有的上下文,对应的就是全局对象Global  Obeject---全局上下文和局部对象 Active Object---局部上下文

        一个函数在定义时,Scopes属性中已经储存了GO

        一个函数在运行时 Scopes属性中会逐一添加AO

        函数在每次运行时,都会产生一个独一无二的AO,当函数执行完后,它所产生的AO对象会被销毁,当然闭包又是另一个情况,这个我后面会详细说明

二.全局作用域

在上一篇中在js预解析过程,分析过如何产生一个上下文--全局对象GO的过程,这里不再赘述,详情请看【面试题-描述一下JS预编译过程?】超级详解_悠悠-wzr的博客-CSDN博客

三.函数作用域之闭包

闭包:

一个作用域可以访问到另一个作用域中的变量,并且作用域链不释放的现象

  • 闭包中的闭是指的局部变量的私有性,包指的是储存的这个局部变量

  •         function father() {
                var time = 1;
                return function son() {
                    time++;
                    return time;
                }
            }
            var temp = father()();
            console.log(temp)

    上述例子就是,temp作为一个新的函数,访问到了另一个函数的变量time,

  • 原理

temp牵住了son,son牵住了father,使得,father函数执行完之后作用域不能立刻销毁。

四.作用域链

官方解释:[[scopes]]中所存储的执行器上下文(上下作用域)对象的集合,这个集合呈链式链接,我们把这种链式叫做作用域链

函数在执行过程中会产生作用域,一个嵌套函数(套娃)在寻找变量的时候,会沿着作用域链查找

最简单的作用域链就是,局部作用域会查找到全局作用域:

 var x = 1

        function fn() {
            return ++x;
        }
        console.log(fn());//结果为2
/*
fn的局部作用域中没有定义x变量,此时会向上级作用域查找,在全局作用域中定义了x这个变量并且赋值,所有++x
,,即是++1=2;所以结果为2
/*

下面是一张百度的图解:

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值