共同点

改变函数执行时的上下文
调用 call 和 apply 的对象,必须是一个函数

call

Function.call(obj, param1, param2, …, paramN)

注意点:

  1. 调用 call,必须是函数
  2. call 第一个参数是一个对象,function 的调用者,this 指向这个对象,不传默认为 window
  3. 第二个参数开始,接收任意个参数,每个参数映射到 function 参数
1
2
3
4
5
6
7
function func (x, y, z) {
this.sum = x + y * z
return this
}

func.call({}, 1, 3, 5)
// this = {sum: 16}

apply

Function.apply(obj, [argArray])

注意点:
1.调用 apply,必须是函数,只接受两个参数
2.第一个参数同 call
3.第二个参数必须是数组

1
2
3
4
5
6
7
8
9
10
11
12
function print(a, b){
Object.keys(this).forEach(x => {
console.log(this[x])
})
return `a + b: ${a + b}`
}

print.apply({
'a': 10,
'b': 12,
'c': 22
}, [11, 23, 33])

类数组

1
2
3
4
5
6
let arrayLike = {
0: 1,
1: 2,
2: 3,
length: 3
};

特征:
具备和数组特征类似的对象
可以索引取值,赋值
可以遍历
具有 length 属性

无法使用forEach、splice、push等数组原型链上的方法

call、apply 用途

  • call

    对象继承
    借用方法

  • apply

    Math.max
    实现两个数组合并

bind

1
2
3
4
5
6
7
8
9
10
function add (a, b) {
console.log(`add: ${this}`)
return a + b;
}
function sub (a, b) {
console.log(`sub: ${this}`)
return a - b;
}
add.bind(sub, 5, 3); // 这时,并不会返回 8
add.bind(sub, 5, 3)(); // 调用后,返回 8

bind 返回的是函数,需要再次调用才能执行