1. 函数模式
function fn(){
console.log("我是函数调用")
}
fn()
2. 方法模式
let obj = {
fn(){
console.log("我是方法调用")
}
}
obj.fn()
3. 构造器模式
function Person(name){
this.name = name
}
let p = new Person("小红")
4. 上下文模式(显式绑定)
- apply()、call(),改变this指向,同时也会调用函数
- bind(),改变this指向,返回这个函数
function fn1(){
console.log(this)
}
let obj = {}
fn1.apply(obj)
4.1 call 的基本使用
function fn(a, b, c) {
this.count = a + b + c
}
let obj = {}
fn.call(obj, 3, 6, 9)
console.log(obj);
4.2 apply 的基本使用
function fn(a, b, c) {
this.count = a + b + c
}
let obj = {}
fn.apply(obj, [3, 6, 9])
console.log(obj);
4.3 bind 的基本使用
function fn(a, b, c) {
this.count = a + b + c
}
let obj = {}
let fn1 = fn.bind(obj, 3, 6, 9)
fn1()
console.log(obj);
4.4 连续点call的问题
function fn1() {
console.log(111)
}
function fn2() {
console.log(222);
}
fn1.call(fn2)
fn1.call.call(fn2)
fn1.call.call.call(fn2)
fn1.call.call.call.call(fn2)
4.5 new与显式绑定优先级
- new 的优先级要大于显式绑定,通过 bind 就可以看出
- 但是 call 和 apply 是直接执行,所以 new 还来不及更改