前言:很多人都知道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