javaScript权威指南上的解释是: call() 、apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数。bind() 就是将某个函数绑定到某个对象上。
关于call() 和 apply() 在犀牛书上的解释可能比较生涩难懂,我的理解就是,它们的作用是: 让函数在某个指定的对象下执行。
例:
var obj = {x: 1}
function foo() {console.log(this.x)}
foo.call(obj) //打印结果: 1
call() 和apply()的第一个参数相同,就是指定的对象。这个对象就是该函数的执行上下文。
call()和apply()的区别就在于,两者之间的参数。
call()在第一个参数之后的 后续所有参数就是传入该函数的值。apply() 只有两个参数,第一个是对象,第二个是数组,这个数组就是该函数的参数。
那就可以理解为:
var obj = {};
function fn(a,b,c){}
fn.call(obj,a,b,c); //第一个参数是该函数的对象,其余参数是函数的参数;
fn.apply(obj,[a,b,c]); //第一个参数是函数的对象,第二个参数是由函数的参数组成的数组
例1:
var obj = {};
function foo(a, b, c) {
console.log(b);
}
foo.call(obj, 1, 2, 3) //打印结果: 2;
例2:
var obj = {};
function foo(a, b, c) {
console.log(b);
}
foo.apply(obj, [1, 2, 3]) //打印结果: 2;
bind() 方法和前两者不同在于: bind() 方法会返回执行上下文被改变的函数而不会立即执行,而前两者是直接执行该函数。他的参数和call()相同。
fn.bind(obj,a,b,c); //与call()的参数相同
这三个方法的作用都是改变函数的执行上下文!