Function类 call apply bind
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
函数的三种角色
- 作为一个普通函数执行(形参 实参 返回值)
- 执行过程
- 开辟一个新的作用域
- 形参赋值
- 变量提升
- 函数体从上到下执行
- 销毁作用域
- 作为一个类(new Fn构造函数执行)
- 每个构造函数都有一个prototype属性 他的值 是一个对象 用来存放当前类型的公有属性和方法
- 必须通过new 操作符调用函数才能返回一个实例对象
- 执行过程
- 新开辟一个作用域
- 形参赋值
- 变量提升
- 隐式创建一个当前类的实例对象 并把构造函数中的this指向当前实例
- 执行构造函数中的代码
- 隐式返回实例对象 相当于 return this
- 销毁作用域
- 函数也是第一个普通对象(通过.属性名 或 ['属性名'] 获取私有属性)
- 把函数当做普通对象使用 就像操作普通对象一样操作对象
通过 函数名.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到的新函数
- 不会让函数执行
- 绑定函数的参数的作用