资讯专栏INFORMATION COLUMN

Javascirpt - 理解执行上下文以及作用域链

e10101 / 2349人阅读

摘要:本文章记录本人在深入学习执行上下文以及作用域链中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。每个执行上下文都与一个作用域链关联在一起。该对象的属性的值是它被创建时的执行上下文对应的作用域链。

本文章记录本人在深入学习执行上下文以及作用域链中看书理解到的一些东西,加深记忆和并且整理记录下来,方便之后的复习。

执行上下文概念

执行上下文,是ECMAScript规法中用来描述js代码执行的抽象概念。所有的js代码都是在某个执行上下文运行的。在一个执行上下文中调用一个函数,会进入一个新的执行上下文。调用结束就回到原来的执行上下文中。在函数调用的过程中,如果调用了其他的函数,那么将进入一个新的执行上下文,就会形成一个执行上下文栈。

每个执行上下文都与一个作用域链关联在一起。该作用域链用来在函数执行时求出标识符的值。作用域链中包含许多的对象,在标识符进行求值的时候,先从链首开始,接着依次查找后面的对象,直到某个对象中的标示符名称相等的属性。

执行上下文顺序

在进入执行上下文时候,会按照顺序执行下面的操作:

创建激活对象
激活对象是在进入执行上下文时候创建出来的,并且与新的执行上下文关联在一起。在初始化构造函数的时候,该对象包含一个arguments属性。激活对象在变量初始化也会用到。

创建作用域链
每一个函数都有一个内部属性[[scope]],它的值是一个包含多个对象的链。这个属性的具体指与函数的创建方式和代码中的位置有很大的关系。这一步的操作是把上一步创建的激活对象添加到函数的[[scope]]属性对应的链的前面。

变量初始化
对函数中需要用到的变量进行初始化。初始化时使用到的对象是前面创建的激活对象,不过这个时还不能称作为变量对象。函数的实际参数、内部函数的局部变量是会被初始化的。局部变量是在变量对象创建的过程中创建了同名的属性,这个属性值为undefined,在函数执行的过程中才会被真正的赋值。

函数上下文环境

函数总是在自己的执行上下文环境中运行,例如读/写局部变量、函数参数,以及运行内部逻辑结构等等。创建上下文环境的过程中,js会遵守下面的规则:

根据调用时传递的参数创建调用对象。

创建参数对象,存储参数变量。

创建对象属性,存储函数定义的布局变量。

把调用对象放在作用域链的头部,方便检索。

执行函数结构体的代码。

返回函数的返回值。

作用域

js中作用域又分为词法作用域(定义作用域)动态作用域。在函数还没调用之前,根据函数结构的嵌套关系来确定函数的作用域。因此作用域取决于源代码,通常编译器可以进行静态的分析来确定标示符的引用。

动态作用域
动态作用域(定义作用域),当函数被调用之后,其作用域会因为调用而发生变化,此时作用域链也会随之调整。

词法作用域(定义作用域)
词法作用域(定义作用域)用来说明函数定义是存在的嵌套关系。当函数被执行的时候,作用域可能发生变化。js函数运行在它们的作用域中,而不是它们执行的作用域

3种创建函数的作用域

创建函数有3种方法,分别是:function函数声明,function表达式和使用function构造器函数。使用不同的创建函数的方式,所scope属性也会有所不同,从而影响函数执行过程中的作用域链。

使用函数声明的函数对象是在进入执行上下文的时候变量初始化的过程中创建的。该对象的scope属性的值是它被创建时的执行上下文对应的作用域链。

使用函数表达式的函数对象是在该表达式被执行的时候创建的。该对象的scope属性的值与使用函数声明创建的对象一样。

使用函数构造器的声明一个函数通常有两种方式,常用的就是var funcName = new Function(x1, x2, ... xn),其中x1,x2 ..., xn表示的是该函数的形参,使用该方式的函数对象是在构造器调用的时候创建的。该对象的scope属性的值一直是一个只包含全局对象的作用域链。

  

最后,如果文章有什么错误和疑问的地方,请指出。与sf各位共勉!目前是未完待续!!!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85662.html

相关文章

  • 对javascript中闭包的理解

    摘要:在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容。闭包的用途闭包可以用在许多地方。这里仅仅是我对闭包的一些见解,若有错误的地方,还望大家提出,一起交流共同进步参考文献你不知道的上卷深入理解系列 在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容。之前我对闭包的理解主要是通过闭包可以在函数外部能访问到函数内部的变量,对闭包运用的也很少,甚至自己写过闭包自己都...

    Enlightenment 评论0 收藏0
  • 深入贯彻闭包思想,全面理解JS闭包形成过程

    摘要:下面我们就罗列闭包的几个常见问题,从回答问题的角度来理解和定义你们心中的闭包。函数可以通过作用域链相互关联起来,函数内部的变量可以保存在其他函数作用域内,这种特性在计算机科学文献中称为闭包。 写这篇文章之前,我对闭包的概念及原理模糊不清,一直以来都是以通俗的外层函数包裹内层....来欺骗自己。并没有说这种说法的对与错,我只是不想拥有从众心理或者也可以说如果我们说出更好更低层的东西,逼格...

    snowell 评论0 收藏0
  • 理解JavaScript中的作用域和作用域链

    摘要:示例当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。每一个运行期上下文都和一个作用域链关联。此时,作用域链中函数的所有局部变量所在的作用域对象会被推后,访问代价变高了。 作用域 作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。 作用域链 函数对象有一个内部属性[...

    XanaHopper 评论0 收藏0
  • JavaScript深入系列15篇正式完结!

    摘要:写在前面深入系列共计篇已经正式完结,这是一个旨在帮助大家,其实也是帮助自己捋顺底层知识的系列。深入系列自月日发布第一篇文章,到月日发布最后一篇,感谢各位朋友的收藏点赞,鼓励指正。 写在前面 JavaScript 深入系列共计 15 篇已经正式完结,这是一个旨在帮助大家,其实也是帮助自己捋顺 JavaScript 底层知识的系列。重点讲解了如原型、作用域、执行上下文、变量对象、this、...

    fxp 评论0 收藏0
  • 前端基础进阶(四):详细图解作用域链与闭包

    摘要:之前一篇文章我们详细说明了变量对象,而这里,我们将详细说明作用域链。而的作用域链,则同时包含了这三个变量对象,所以的执行上下文可如下表示。下图展示了闭包的作用域链。其中为当前的函数调用栈,为当前正在被执行的函数的作用域链,为当前的局部变量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初学JavaScrip...

    aikin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<