函数
- arguments修改值会修改对应参数的值,解决办法是use strict
- 函数上下文
对于方法而言 即为方法所在的对象
对于顶级函数而言,严格模式是undefined,非严格模式是window
对于构造函数而言,是一个新创建的对象实例
对于apply call 是传入的对象
对于bind 是绑定的对象,返回的是函数 - 箭头函数的this与声明所在的上下文的相同
闭包
-
闭包用途
- 封装私有变量
- 处理回调函数
闭包使用原因:可以封装状态,不污染全局变量,写法简便,可复用性强
-
执行上下文
全局执行上下文和函数执行上下文 -
const var let
通过const定义的基本数据类型的值只能设置一次
const定义的对象不可变,但属性值可以变
let 和var都定义变量 值可以变,var有变量提升,let没有,let定义的变量在声明之前使用会陷入暂时性死区报错
从语法环境来说 var定义的变量是在距离最近的函数内部或是在全局此法环境中定义的,这也是变量提升的原因,var会忽略块级作用域,let和const直接在最近的此法环境中定义变量(包括块级作用域,循环内,函数内或全局环境内) -
函数的提升优先级
javascript的代码执行是分两个阶段的- 第一阶段,没有执行代码,JavaScript引擎会访问并注册当前词法环境中所声明的变量和函数
- 第二阶段 根据变量类型和环境类型具体执行代码
所以在代码执行前,函数已经存在,函数的声明顺序无关紧要
注意:只针对函数声明有效,函数表达式和箭头函数是在执行过程中定义的,所以都不行
生成器和promise
- 调用生成器并不会执行生成器函数,会创建迭代器对象,与生成器通信