JavaScript中的call、apply、bind方法

来源:互联网 发布:正交矩阵的性质 编辑:程序博客网 时间:2024/05/22 12:58

JavaScript中的call()、apply()、bind()方法

在JavaScript中, call()、apply()、bind()是函数对象的方法,主要用于改变函数的调用对象,改变上下文的this。


一、方法参考

call()

语法:function.call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:将函数作为对象的方法调用–调用一个对象的一个方法,以另一个对象替换当前对象。
说明:call()将制定的函数function作为对象thisobj的方法来调用,并传入参数列表中thisobj之后的参数。返回的是调用function的返回值。在函数体内,关键字this指代thisobj对象,如果thisobj为null,则只用全局对象。

apply()

语法:function.apply([thisObj[,argArray]])
定义:将函数作为一个对象的方法调用–应用某一对象的一个方法,用另一个对象替换当前对象。
说明:apply()将制定的函数function作为对象thisobj的方法来调用,并传入在args数组中包含的参数,返回调用function的返回值,apply的第一个参数thisObj和call方法的一样,第二个参数argArray为一个传参数组。在函数体内,关键字this指代thisobj对象,如果thisobj为null,则只用全局对象。

bind()

语法:function.bind([thisObj[,arg1[, arg2[, [,.argN]]]]])
function.bind(thisobj)
定义:返回一个作为方法调用的函数。
说明:返回一个新函数,该函数会当作对象thisobj的方法来调用。bind的thisObj参数也和call方法一样,t在函数体内,关键字this指代thisobj对象,如果thisobj为null,则只用全局对象。。arg1 … argN可传可不传。如果不传,可以在调用的时候再传。如果传了,调用的时候也传了,则不生效。如:

var person = {    name:"cat",    age:20,    sayHello:function(age){        console.log(this.name);        console.log(age);    }};var son = {    name:"cat2"};var test= person.sayHello.bind(son);test(25); // cat2  25
var test= person.sayHello.bind(son,25);test(); // cat2  25
var test= person.sayHello.bind(son,25);test(30); // cat2  25

二、区别

1、arg传参不同:call需一个一个传,apply传入数组。

function say(name,age){    console.log(name);    console.log(age);}say.call(this,"cat",22);say.apply(this,["cat",22]);

2、执行方式不同:call和apply直接执行函数,bind需要再一次调用。

var obj = {    a: 81,};var f= {    getX: function() {return this.a;}}console.log(f.getX.bind(obj)());  //81console.log(f.getX.call(obj));    //81console.log(f.getX.apply(obj));   //81

总结

call和apply都是改变上下文中的this并立即执行这个函数,bind方法可以让对应的函数想什么时候调就什么时候调用,并且可以将参数在执行的时候添加,这是它们的区别,根据自己的实际情况来选择使用。
0 0
原创粉丝点击