变量的作用域和作用域链

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

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

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

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


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

废话少说,上代码

    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

 练习七

练习八

猜你喜欢

转载自blog.csdn.net/qq_44694453/article/details/119598415