我的回答
function能产生词法作用域
this的指向分为这几种
- 谁调用函数this就指向谁, 如果直接调用指向window
- 使用call, apply, bind改变this指向
- 箭头函数没有this指向, 会往上层作用域找, 直到找到this, 找不到最后会找到window
参考回答
词法作用域包含了执行上下文中的变量声明,this是执行上下文的一个可能为空值的属性,是对对象的引用
JS引擎执行一段和当前执行上下文(running execution context)无关的代码,会创建一个对应的执行上下文用于追踪代码执行过程,并将当前执行上下文指向该上下文。
执行上下文的创建过程中会根据语法块(块级作用域)创建对应的环境记录
词法作用域会通过环境记录(Environment Record)来存储标识符与实际变量的映射关系,和一个外部环境(OuterEnv)来引用上级作用域
环境记录包括词法环境和变量环境,块级声明如let/function等存于词法环境,其他声明如var等存于变量环境
代码执行中,词法环境可能会建立环境记录与this的绑定。解析this时,从当前上下文中开始直到全局,返回最近可用的this绑定。
- 词法作用域是书写代码时函数声明的位置来决定的,this涉及动态作用域,取决于变量和函数被调用的地方;
- 词法作用域在函数定义的时候决定了函数的作用域,而this是在调用时才确定作用域
- 词法作用域采用的是就近原则,函数内部变量会当前函数里的变量取值,如果没有找到这个变量,就向上查找;
- 词法作用域相当于静态作用域,只有用with和eval才能改变其作用域;this相当于动态作用域,this指向取决于函数在哪调用