call、apply、bind 的用法分别是什么?

它们最主要的作用是 改变this的指向

call()

call() 写法 : function.call(thisArg, arg1, arg2, ...)

call()调用一个函数,第一个参数是指定的this值,其他参数分别是提供的参数,用逗号隔开。

call()用法

1
2
3
4
5
6
7
8
function fn(a,b,c){

}
// fn 的this指向的是obj, 参数是 1,2,3
fn.call(obj,1,2,3)

// 这个fn 的this指向obj, 但它参数是 [1,2,3] 、 undefined 、 undefined
fn.call(obj,[1,2,3])

apply()

apply()写法: func.apply(thisArg, [argsArray])

apply 只接收俩个参数, 第一个参数和call一样。 第二个参数,必须是数组或者类数组。

apply() 和call() 使用上是一致的,唯一区别在于 call() 方法接受若干个参数,而apply()方法接受一个包含多个参数的数组

bind()

bind() 不同于 call() 和 apply() , 它返回一个新的函数,该函数将this设置未我们赋给它的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// mdn demo
this.x = 9; // 在浏览器中this指向全局的 window 对象
var module = {
x: 81,
getX: function() { return this.x; }
};

module.getX(); // 81

var retrieveX = module.getX;
retrieveX();
// 返回9 - 因为函数是在全局作用域中调用的

// 创建一个新函数,把this绑定都module对象上
var bondGetX = retrieveX.bind(module);
bondGetX(); // 81