函数

  • arguments修改值会修改对应参数的值,解决办法是use strict
  • 函数上下文
    对于方法而言 即为方法所在的对象
    对于顶级函数而言,严格模式是undefined,非严格模式是window
    对于构造函数而言,是一个新创建的对象实例
    对于apply call 是传入的对象
    对于bind 是绑定的对象,返回的是函数
  • 箭头函数的this与声明所在的上下文的相同

闭包

  • 闭包用途

    1. 封装私有变量
    2. 处理回调函数
      闭包使用原因:可以封装状态,不污染全局变量,写法简便,可复用性强
  • 执行上下文
    全局执行上下文和函数执行上下文

  • const var let
    通过const定义的基本数据类型的值只能设置一次
    const定义的对象不可变,但属性值可以变
    let 和var都定义变量 值可以变,var有变量提升,let没有,let定义的变量在声明之前使用会陷入暂时性死区报错
    从语法环境来说 var定义的变量是在距离最近的函数内部或是在全局此法环境中定义的,这也是变量提升的原因,var会忽略块级作用域,let和const直接在最近的此法环境中定义变量(包括块级作用域,循环内,函数内或全局环境内)

  • 函数的提升优先级
    javascript的代码执行是分两个阶段的

    1. 第一阶段,没有执行代码,JavaScript引擎会访问并注册当前词法环境中所声明的变量和函数
    2. 第二阶段 根据变量类型和环境类型具体执行代码
      所以在代码执行前,函数已经存在,函数的声明顺序无关紧要
      注意:只针对函数声明有效,函数表达式和箭头函数是在执行过程中定义的,所以都不行

生成器和promise

  • 调用生成器并不会执行生成器函数,会创建迭代器对象,与生成器通信