浅谈作用域、作用域链

416 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战 !

u=1636748587,3820171967&fm=26&fmt=auto&gp=0.jpg

作用域

变量与函数的作用范围

分类:

  1. 全局作用域
  • 函数外定义的变量拥有全局作用域
  • 所有window对象上的属性拥有全局作用域
  • 没有声明在任何函数内部的函数拥有全局作用域
var type = "a"; 
// 函数外可拿到type变量 
function myFunction() {
// 函数内也可拿到type变量 
}
  1. 局部作用域

在函数内部就是局部作用域,只在函数的内部起作用

function myFunction() { 
    var type = "a";//只能在函数内部拿到type变量,函数外部拿不到
}
  1. 块级作用域

    ECMAScript6中新增了块级作用域,let声明的变量只能在块级作用域里访问,会形成暂时性死区(声明前不可用),不能跨块访问,也不能跨函数访问,无变量提升,不可以重复声明

特点:

  1. 通过let和const声明,所声明的变量在指定块的作用域外无法被访问
  2. 在函数内部创建,在代码块内部{}起作用
  3. 特点:声明变量不会提升到代码块顶部,禁止重复声明
  4. const是只读的特性,声明的过程中就必须赋值
  5. const在声明过后不可修改

作用域链

当在内部函数中,需要访问一个变量的时候,首先会访问函数本身的变量对象,是否有这个变量,如果没有,那么会继续沿作用域链往上查找,直到全局作用域。这么一个查找过程形成的链条就叫做作用域链

作用域和执行上下文区别:

  1. 作用域是静态的,只要函数定义好了就一直存在,并且不再发生变化。 执行上下文时动态的,调用函数时创建,调用结束后就会自动释放。

  2. 执行上下文对象是从属于所在的作用域。全局上下文环境==>全局作用域,函数上下文环境==>对应的函数作用域