每天3小时学前端之JS-第15天-执行环境+作用域

528 阅读3分钟

此系列体验视频教程

点击观看:哔哩哔哩

函数

执行环境

  • 执行环境(执行上下文)是JS中非常重要的一个概念。
  • 每个执行环境都有一个与之关联的虚拟对象(执行上下文对象)
  • 执行环境中定义的所有变量函数都保存在这个执行上下文对象中,供解析器在处理数据时使用。

预处理

  • 将变量和函数作为执行上下文对象的属性放到这个对象上的这个过程,被称为预处理
  • 预处理发生在代码将要执行之前
  • 虽然JS是解释执行的语言,但是在解释执行之前,还是有个预处理的过程
  • 为代码的执行做准备,提前检查出代码中的错误
  • 算是做了一个通篇扫描的过程
  • 这也是之前讲过的变量的声明提升和函数提升的原因

全局执行上下文对象

  • 形成于JS代码将要执行之前
  • 是最顶层的执行上下文
  • 浏览器中是window对象
  • 所有全局变量和全局函数都是window对象的属性和方法
  • 全局变量和全局函数会一直存在,直到页面关闭
  • 随着页面的关闭而销毁

全局的预处理

  1. 将通过var声明的全局变量添加为window的属性,值为undefined
  2. 将使用function关键字声明的全局函数添加为window的方法,值为函数体

函数执行上下文对象

  • 必须要调用函数才会创建
  • 形成于函数内代码将要执行之前
  • 每个函数都有自己的函数执行上下文对象
  • 局部变量和局部函数随着函数调用结束而销毁
  • 随着函数调用结束而销毁

函数的预处理

  1. 将通过var声明的局部变量添加为函数执行上下文对象的属性,值为undefined
  2. 将实参赋值给形参,并添加为函数执行上下文对象
  3. 将使用function关键字声明的局部函数添加为函数执行上下文对象的方法,值为函数体

作用域

作用域(scope)指的是变量存在的范围。在 ES5 的规范中,JS只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域,暂时不涉及。

  • 没有在任何函数内部声明的变量是全局变量,在任何函数内部都可以获取并更改
  • 函数内部通过var声明的变量,在全局是无法获取的
  • 代码写好,作用域就确定了
  • 函数内部非var关键字声明的变量,为全局变量
  • 没有块作用域
  • 如果有函数嵌套,则会由内而外形成作用域链