JS this的一点记录

113 阅读2分钟

前言:很多人都知道JS的this指向,我这里只是做个笔记,没什么深度,大家选择性的看看。

JS写AST树是为了降级,因为是弱语音,不像其他语言。

JS 如何赋值和使用,有什么区别?

- `var a`:
 声明变量:编译器先看作用域里有没有这个变量,有就跳过,没有就生成变量并命名。
- `a = 2`:
赋值:编译器先看作用域里有没有这个变量,有就赋值。没有就往上一层作用域中找。

作用域

作用域,就是根据名称查找变量的规则。

词法作用域/静态作用域

词法作用域就是,定义在词法阶段的作用域。 词法作用域就是你写代码的时候,将变量写在哪里决定的, 因此,当词法分析器处理代码时,会保持作用域不变。 (eval, with)

函数作用域

函数作用域就是,属于这个函数的全部变量,都可以在整个函数内使用。

上下文

词法作用域,是在写代码的时候,或者在定义时,确定的; 而动态作用域,是在运行时确定。 [高阶函数]

闭包

#### 面试时被问到什么是闭包,如何解释?
> 函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。

执行上下文 不等于 词法作用域。

#### 闭包的使用场景?
- 当我使用FP(函数式编程)的时候,基本上就有闭包了。
- 当一个函数的执行,和上下文相关的时候,基本上就有闭包了。
- 保存当前的执行环境

this 指向

-----尽量背下来---------

--简单调用时,this 默认指向 window/global/undefine (浏览器/node/严格模式)

--对象调用时,绑定在对象上.

--使用call,apply,bind时,绑定在指定的函数上。

--使用new关键字,绑定在新创建的对象上。

以上三条优先级 new > call,apply,bind > 对象调用。


使用箭头函数,this指向是根据外层决定的,因为箭头函数没有this