Function类 call apply bind

127 阅读3分钟

Function类 函数类 所有的函数都是Function的一个实例

  • 内置类 Array Number String Boolean Object Date Function等
  • 内置类 都是Function 类的实例
  • 而实例都有一个__proto__指向所属类的原型对象
  • js中所有函数都是Function 类的实例
  • Array.proto === Function.prototype
  • Date.proto === Function.prototype
  • Object.proto === Function.prototype
  • Function.prototype.proto === Object.prototype
  • 所有函数都是Function类的实例
  • 所有的引用类型(普通对象 实例对象 函数 类 数组 Date)的都是Object这个基类的实例 所以函数也是对象
  • Function 函数类 本事也是一个函数
  • Function.proto === Function.prototype
  • Function instanceof Object

函数的三种角色

  1. 作为一个普通函数执行(形参 实参 返回值)
    • 执行过程
      • 开辟一个新的作用域
      • 形参赋值
      • 变量提升
      • 函数体从上到下执行
      • 销毁作用域
  2. 作为一个类(new Fn构造函数执行)
    • 每个构造函数都有一个prototype属性 他的值 是一个对象 用来存放当前类型的公有属性和方法
    • 必须通过new 操作符调用函数才能返回一个实例对象
    • 执行过程
      • 新开辟一个作用域
      • 形参赋值
      • 变量提升
      • 隐式创建一个当前类的实例对象 并把构造函数中的this指向当前实例
      • 执行构造函数中的代码
      • 隐式返回实例对象 相当于 return this
      • 销毁作用域
  3. 函数也是第一个普通对象(通过.属性名 或 ['属性名'] 获取私有属性)
    • 把函数当做普通对象使用 就像操作普通对象一样操作对象 通过 函数名.xxx = xxx 添加的属性 都是私有属性 若这个函数被当做构造函数调用时 不属于实例的属性 也不属于实例的公有属性 只能通过 函数名.xxx 的方式获取

Array.isArray() 是数组的静态方法 只能通过Array 自己调用 检测一个值 是否是数组

Function.prototype 上的三个方法 工实例来修改函数中this的指向

call

  • 使用call方法修改 this
  • 语法:函数名.call(ctx,实参1,实参2,....)
  • 参数: ctx 将函数中的this 修改为ctx 从第二个参数开始 后面的参数都是传递给函数执行的实参
  • 作用 修改方法中的关键字为call方法的第一个实参ctx 并把后面的参数当做实参传给函数
  • 最后让函数执行
  • 若call的第一个参数为null undefined 或不传 这时 函数this 指向window

apply

  • 语法 函数名.apply(ctx,[实参1,实参2,....]);
  • 参数 : ctx 将函数中的this 修改为ctx 第二个参数是一个数组 数组项都是传递给函数的实参
  • 作用:修改函数中的this 并把数组项作为实参传递给函数 并执行 call 是一个一个的传递,apply 是把实参放到一个数组中打包传递给函数

bind(绑定this关键字)

  • 语法 函数名.bind(ctx,实参1,实参2,...)
  • 作用 : 绑定函数中this关键字 并返回一个绑定了this到的新函数
  • 不会让函数执行
  • 绑定函数的参数的作用