js-关于执行上下文与作用域

JavaScript的作用域包括全局作用域、函数作用域和块级作用域,其中全局作用域可能导致命名冲突。作用域链决定了变量查找的顺序,从当前作用域逐级向上查找直至全局对象。执行上下文包括全局、函数和eval上下文,JavaScript引擎使用执行上下文栈来管理这些上下文,按需创建和销毁。
摘要由CSDN通过智能技术生成

JavaScript的作用域也就是JavaScript识别变量的范围,作用域链也就是JavaScript查找变量的顺序

作用域

  1. 全局作用域
  • 最外层函数和最外层函数外面定义的变量拥有全局作用域
  • 所有未定义直接赋值的变量自动声明为全局作用域
  • 所有window对象的属性拥有全局作用域
  • 全局作用域有很大的弊端,过多的全局作用域变量会污染全局命名空间,容易引起起名冲突
  1. 函数作用域
  • 函数作用域声明在函数内部的变量,一般只有固定的代码片段可以访问到
  • 作用域是分层的,内层作用域可以访问外层作用域,反之不行

:只有函数的{}才可以形成作用域,对象的{}不是作用域!

  1. 块级作用域
  • 使用ES6新增的let和const指令可以声明块级作用域,块级作用域可以在函数中创建,也可以在一个代码块中创建(由{ }包裹的代码片段)
  • let和const声明的变量不会有变量提升,也不可以重复声明
  • 一般在循环中绑定块级作用域,这样可以把声明的计数器函数限制在循环内部

作用域链

在当前作用域中查找所需变量,但是该作用域没有这个变量,那这个变量就是自由变量。如果在自己作用域找不到该变量就去父级作用域查找,依次向上级作用域查找,直到访问到window对象就被终止,这一层层的关系就是作用域链。

作用域链的作用是保证对执行环境有权访问的所有变量和函数的有序访问,通过作用域链,可以访问到外层环境的变量和函数

作用域链的本质上是一个指向变量对象的指针列表。变量对象是一个包含了执行环境中所有变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(也就是全局对象)始终是作用域链的最后一个对象。

当查找一个变量时,如果当前执行环境中没有找到,可以沿着作用域链向后查找。

简单来说:作用域链就是由最内层的作用域往最外部查找变量的过程,形成的链条就是作用域链。

执行上下文类型

执行上下文也叫执行环境,分为全局执行上下文、函数执行上下文和eval函数执行上下文。

  1. 全局执行上下文
    任何不在函数内部的都是全局执行上下文,它首先会创建一个全局的window对象,并且设置this的值等于这个全局对象,一个程序中只有一个全局执行上下文。
  2. 函数执行上下文
    当一个函数被创建的时候,就会为该函数创建一个新的执行上下文,函数的上下文可以有多个
  3. eval函数执行上下文
    执行在eval函数中的代码会有属于他自己的执行上下文,不过eval函数不常用,仅做了解

执行上下文栈

  • JavaScript引擎使用执行上下文栈来管理执行上下文
  • 当JavaScript执行代码时,首先遇到全局代码,会创建一个全局执行上下文并且压入执行栈中,每当遇到一个函数调用,就会为该函数创建一个新的执行上下文并压入栈顶,引擎会执行位于执行上下文栈顶的函数,当函数执行完成之后,执行上下文从栈中弹出,继续执行下一个上下文。当所有的代码都执行完毕之后,从栈中弹出全局执行上下文。

简单来说执行上下文就是指:
在执行一点JS代码之前,需要先解析代码。解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来,变量先赋值为undefined,函数先声明好可使用。这一步执行完了,才开始正式的执行程序。

在一个函数执行之前,也会创建一个函数执行上下文环境,跟全局执行上下文类似,不过函数执行上下文会多出this、arguments和函数的参数。

  • 全局上下文:变量定义,函数声明
  • 函数上下文:变量定义,函数声明,thisarguments
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值