变量的作用域和作用域链

本文深入解析变量作用域的概念,区分全局变量和局部变量,并介绍作用域链的工作原理。通过实例演示和代码执行过程,揭示JS解释器如何查找和处理变量。重点讲解了提升声明而非赋值的特点以及函数执行上下文中的AO和GO对象。最后通过实战练习巩固理解,涉及变量查找规则和基本类型比较运算符。
摘要由CSDN通过智能技术生成

首先 ,什么是变量的作用域呢?

顾名思义,域就是范围的意思,变量的作用域就是变量作用的范围。

首先,要想知道变量的作用范围,我们要先了解全局变量局部变量

全局变量 : 在代码的最外层声明变量,我们称为全局变量。在任何地方都可以使用的变量,包括函数内部; 


局部变量: 在函数内部声明的变量,我们称为局部变量.只能在函数内部使用。

废话少说,上代码

    var g =500; //变量声明在最外层,作用于全局
        var r = 30;
        console.log(g);//500
        function fn() {
            var g = 300; //局部变量
            console.log(g);//300
            sum();
            function sum(){
                console.log(r);//30 r是在最外层声明的  全局变量
            }
        }
        fn(); //执行函数

变量c 没有声明,往上一级找到就赋值,如果没有就到window对象里面添加

OK,学习完变量的作用域后,我们就开始讲我们本节的难点,作用域链。

作用域链 :通俗地讲,当声明一个函数或变量时,如果局部需要访问该变量或函数时,刚好自己本身没有该变量或函数,局部作用域会往上一级找,这就是作用域链。

如下图:

 概念懂了,但是在实际操作中,编辑器是如何执行我们的代码呢?不要担心,让小编来为你解答。那就让我们来学习一下JS解释器执行js代码的大致过程。

JS解释器执行js代码的步骤:

  1. 语法检查:大小写、括号匹配等语法检查;
  2. 预编译:
    1. 全局预编译:
      1. 创建一个GO对象,即GlobalObject,执行期上下文;
      2. 把声明的全局变量作为属性追加到该对象里面;
      3. 把函数声明作为对应的属性值;
    2. 局部预编译:在函数调用的前一刻开始预编译  AO;
      1. 创建一个AO对象,即ActiveObject,函数的执行期上下文;
      2. 把函数内部声明的变量、函数名和形参作为属性追加到该执行期上下文对象面;
      3. 把实参的值赋值给对应的属性;
      4. 把函数内部声明的函数作为值赋值给对应的属性;
  3. 执行语句:赋值语句、函数调用语句、循环语句、判断语句等; 


天呐,这是什么东东,这也太复杂了吧,看不懂了吗?不要害怕,我们来代码中体验,效果会更好。这些都是面试题哦。

请记住变量只提升声明,不提升赋值;

一个代码只有一个GO,但是可以有多个AO。

练习一

 

练习二

 练习三

在局部变量中,如果有 没有声明的变量,则往上一级找,找到就赋值,如果没有就到window对象里面添加

 练习四

 练习六

   (function () {b = 3;var a = b;})  ,在函数外面加()表示强制调用  

   (function () {b = 3;var a = b;})()  ,在函数后面j加() 表示自己调用自己 

==  等于     !=  不等于只比较值
===全等于   !==  不全等于比较值和类型

console.log (typeof (typeof undefined));//string

 练习七

练习八

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值