美文网首页
七 预编译 & 初识作用域

七 预编译 & 初识作用域

作者: WIN_Inn | 来源:发表于2018-09-15 22:52 被阅读0次

js执行三部曲 

    语法分析       // 通篇扫描,但是不编译

    预编译           // 四部曲     1.创建AO对象(执行期上下文,也就是作用域) 

                                             2.找形参和变量声明,值为undefined

                                             3.把形参和实参相统一

                                             4.找函数里的函数声明,值赋予函数体

    解释执行       // 解释一行,执行一行    

    预编译发现在函数执行的前一刻

注意: 全局的变量明和局部函数的变量名相同时,内部打印时访问的时内部的变量

            全局的 GO 除了变量不要忘记了函数声明

GO:   window === GO   

var a = 123;  function a(){ } .  console.log( a );    // 打印出123

预编译 

前奏

    函数声明整体声明( 区别于函数表达式 ),变量的声明提升

    暗示全局变量 imply global : 任何变量,如果未经声明描,直接赋值,那么变量归window所有。

    一切声明的全局变量都是window的属性。

var a = b = 3;   //此时b未经声明,所有b是全局变量,window.b可以访问

运行期上下文

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

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

作用域定义

[[scope]] : 每个javascript 函数都是一个对象,对象中有些属性可以访问,但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。

[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。

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

function a ( ) { 

    function b ( ) {

        function c ( ) { 

        }

          c ( ) ;

    }

    b ( ) ;

}

a ( );

a defined :  a.[[scope]] -->  0:GO

a doing     :  a.[[scope]] -->  0: aAO

                                                   1: GO

b defined  : b.[[scope]] -->  0: aAO

                                                   1: GO

b doing     : b.[[scope]] --> 0: bAO

                                                  1: aAO

                                                  2: GO

c defined  : c.[[scope]] --> 0: bAO

                                                 1: aAO

                                                  2: GO

c doing      : c.[[scope]] --> 0: cAO

                                                 1: bAO

                                                 2: aAO

                                                 3: GO

                                                

相关文章

  • 七 预编译 & 初识作用域

    js执行三部曲 语法分析 // 通篇扫描,但是不编译 预编译 // 四部曲 1.创建AO对象(...

  • 成长(4/2000)——面试题合集1

    Javascript 1.作用域 概念: 作用域分全局作用域和函数作用域 预编译 js的两个阶段,预编译和解释执行...

  • 1.预解释和作用域链

    预解释 作用域链

  • 你不知道的 Javascript

    作用域 词法作用域:编译阶段确定(欺骗词法作用域 eval with) 块作用域 with try/catch l...

  • 作用域和闭包

    目录 概述 作用域编译过程词法作用域全局作用域函数作用域 闭包循环和闭包闭包的用途性能 总结 概述 作用域和闭包一...

  • 作用域、作用域链

    作用域 在 JavaScript 中, 作用域为可访问变量,对象,函数的集合。 作用域下浏览器的操作 预解析(找v...

  • JS基础:作用域

    一、作用域概念-预解析规则、表达式 作用域: 域:空间,范围,区域……作用:读,写 浏览器——JS解析器: 在浏览...

  • JS高级-闭包、沙箱

    作用域,作用域链,预解析 变量:局部变量、全局变量 作用域:变量的使用范围 js中没有块级作用域,一对括号中定义的...

  • 7.4使用slot分发内容

    7.4.2作用域 父组件模板的内容是在父组件作用域内编译,子组件模板的内容是在子组件作用域内编译 如果想数据在子组...

  • Vue 组件 / 插槽

    编译作用域 在vue组件中作用域简单的说就是: 父组件模板的内容在父组件的作用域内编译,子组件模板的内容在子组件的...

网友评论

      本文标题:七 预编译 & 初识作用域

      本文链接:https://www.haomeiwen.com/subject/esoggftx.html