作用域

作用域分为:全局作用域和函数作用域在es6中还有块作用域

作用域的定义:就是变量能够作用(使用)的范围

一. 全局作用域

定义:全局作用域就是全局对象(GO)就是window对象,通俗一点就是在任何地方都可以访问到变量就是全局变量,对应的就是全局作用域。

二. 函数作用域

只在固定的代码片段内可以访问到的变量,在函数(function)内的变量就是局部变量要调用时才能访问里面的代码。局部变量对应得就是局部作用域(函数作用域)

注意:

1.在函数内定义变量时没有用(var或者let等声明变量的词)声明的变量就是全局变量(隐式全局变量)而不是局部变量。

2.局部变量退出作用域之后会销毁,全局变量关闭网页或者浏览器时才会销毁并会消耗cpu产生垃圾。所以在写网页时尽量使用局部变量。

三。全局变量与局部变量

      1.全局变量

              定义:全局变量在整个程序代码中都能调用

     2.局部变量

              定义:只能在函数内部调用,在函数外部是不能调用的,

例:

但是全局变量在函数中能调用的。

例:

if里面的变量也是全局变量

例:

五. js解释引擎解释执行js代码的过程

在js代码执行的过程中,会先通篇扫描所有的代码看是否有语法的错误。 如果语法错误会直接报错,代码不再执行。报语法错误的语句:Uncaught SyntaxError:Invalid or unexpected token。语法没有错误的话会进入预编译阶段。

       5.1预编译的四个步骤

             1.创建AO对象,AO就是活动对象,又叫作用域,也叫执行期上下文(局部对象)

               .GO对象就是全局对象

             2.找到形参和变量,把形参和变量作为AO对象的属性名,值是undefined

              3.实参把值赋给形参

             4.在函数中找到函数声明,把函数名作为AO对象的属性名,值是函数

        5.2.全局代码执行的三部曲

                5.2.1. 创建全局对象,全局的仓库

                 5.2.2. 找到变量声明,提升变量声明  // 变量提升

                  5.2.3. 找到函数声明, 提升函数声明

            3. 执行代码

           js代码的执行是单线程的,会解释一行执行一行

       5.3.全局对象解释完了之后开始进行函数对象的执行

               1.进行语法解析

                2.到预编译阶段

                    2.1.1. 创建AO对象

                    2.1.2找到变量声明和形参,赋予默认值为undefined

                    2.1. 3. 将实参的值赋值给形参

                     2.1.4. 找到函数声明,然后提升

                3.执行代码

示例:

代码执行的解释分析:

1.在全局对象中:

    a.扫描全部代码没有语法错误

     b.在全局中查找变量,函数

         b.1没有变量,

          b.2函数:function fn(a){}

2.全局分析结束之后到函数

a . 查找变量:

        var  a = undefind

         var b = undefind

   查找函数声明:

        a:function a (){}

         b:function b (){}

之后提升函数声明把变量

         var  a = undefind     //把undefined换为 函数声明      function a (){}

         var b = undefind     //把undefined换为 函数声明      function b (){}

      

   function fn (a){

            console.log(a);     //  所以这里的 a 输出函数名function a()

            var a = 123;        //把a = 123在覆盖 a = function a (){}

            console.log(a);     //  所以输出 123

            function a (){}     

             console.log(a);    //  123

            console.log(b);    //函数声明提升把 undefined换成了function b(){}所以这里输出function b(){}

            var b = function (){}   

           console.log(b)    //前面var b =  function (){} 把 function b(){}覆盖了所以这里输出 function (){} 

               function b(){}

        }

       fn(1)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。