我的回答

function能产生词法作用域

this的指向分为这几种

  1. 谁调用函数this就指向谁, 如果直接调用指向window
  2. 使用call, apply, bind改变this指向
  3. 箭头函数没有this指向, 会往上层作用域找, 直到找到this, 找不到最后会找到window

参考回答

词法作用域包含了执行上下文中的变量声明,this是执行上下文的一个可能为空值的属性,是对对象的引用

JS引擎执行一段和当前执行上下文(running execution context)无关的代码,会创建一个对应的执行上下文用于追踪代码执行过程,并将当前执行上下文指向该上下文。

执行上下文的创建过程中会根据语法块(块级作用域)创建对应的环境记录

词法作用域会通过环境记录(Environment Record)来存储标识符与实际变量的映射关系,和一个外部环境(OuterEnv)来引用上级作用域

环境记录包括词法环境和变量环境,块级声明如let/function等存于词法环境,其他声明如var等存于变量环境

代码执行中,词法环境可能会建立环境记录与this的绑定。解析this时,从当前上下文中开始直到全局,返回最近可用的this绑定。

  1. 词法作用域是书写代码时函数声明的位置来决定的,this涉及动态作用域,取决于变量和函数被调用的地方;
  2. 词法作用域在函数定义的时候决定了函数的作用域,而this是在调用时才确定作用域
  3. 词法作用域采用的是就近原则,函数内部变量会当前函数里的变量取值,如果没有找到这个变量,就向上查找;
  4. 词法作用域相当于静态作用域,只有用with和eval才能改变其作用域;this相当于动态作用域,this指向取决于函数在哪调用