call、apply、bind(call、apply、bind)

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新增的 扩展运算符
————————

Call () and apply () can be regarded as < strong > methods of an object < / strong >, and < strong > indirectly call functions < / strong > in the form of < strong > calling methods < / strong >.

All functions are called in a specific scope, equal to the value of this set inside the function.

The first argument to call () and apply () is the parent object of the function to be called.

Note: in strict mode, the first argument of call () and apply () will become the value of this, even if the passed in argument is null or undefined.

call()

The first parameter of call () is that the value of this does not change. The other parameters are directly passed to the function. In other words, the parameters passed to the function must be listed one by one.

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()

The usage of apply () is no different from that of call (), but the parameters are different. The apply () method receives two parameters, one is the scope of the < strong > running function < / strong >, and the other is the < strong > array < / strong > (it can be an array instance or an arguments object).

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()

The main function of bind is to < strong > bind a function to an object < / strong >. Returns a new function.

The method is called as a method of the specified object with optional specified parameters.

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新增的 扩展运算符