call() 和apply()可以看作是某个对象的方法,通过调用方法的形式来间接调用函数。
都是在特定作用域中调用函数,等于设置在函数体内的this的值。
call()和apply()的第一实参是要调用函数的母对象。
注:在严格模式中,call()和apply()第一个实参都会变成this的值,哪怕传入的实参是null 或undefined。
call()
call()的第一个参数是this值没有变化,其余参数都是直接传递给函数,换句话说,传递给函数的参数必须逐个列举出来。
function f() { } var o = {}; // 要想以对象o的方法来调用函数f(),可以下面的写法 f.call(o); // 与下面代码的功能类似: o.m = f; o.m();
delete o.m;
// 列举除第一个参数外的其余参数 Math.min.call(this,1,2,3,4,5); // 1 Math.max.call(this,1,2,3,4,5); // 5 // ES6语法 ...为ES6新增的 扩展运算符 Math.min(...[1,2,3,4,5]); // 1 Math.max(...[1,2,3,4,5]); // 5
apply()
apply()的用法和call()并无区别,只是参数不同。apply()方法接收两个参数,一个是在运行函数的作用域,另一个是数组(可以是Array实例,也可以是arguments对象)。
function f() { } var o = {}; // 要想以对象o的方法来调用函数f(),可以下面的写法 f.apply(o); // 与下面代码的功能类似(假设对象o中没有m属性): o.m = f; o.m(); delete o.m; // 列举除第一个参数外的其余参数 Math.min.apply(this, [1, 2, 3, 4, 5]); // 1 Math.max.apply(this, [1, 2, 3, 4, 5]); // 5 // ES6语法 ...为ES6新增的 拓展运算符 Math.min(...[1, 2, 3, 4, 5]); // 1 Math.max(...[1, 2, 3, 4, 5]); // 5
bind()
bind的主要作用是将函数绑定到某个对象。返回一个新函数。
通过可选的指定参数,作为指定对象的方法调用该方法。
function f(y) { return this.x + y;} var o = { x: 1 }; var g = f.bind(o); // 通过g(x)来调用o.f(x) g(2); // 3
...为ES6新增的 扩展运算符