关于javascript中的bind、call、apply等函数的用法

关于javascript中的bind、call、apply等函数的用法

我GitHub上的菜鸟仓库地址: 点击跳转查看其余相关文章
文章在个人博客上的地址: 点击跳转

        前面的文章已经说到this的指向了,那么这篇文章就要说一说和this相关的三个函数的用法:bind( )、call( )和apply( )。javascript

        其实它们都很简单,可是在处理一些与this相关的函数的时候,用来改变函数中this的指向,倒是必不可少的工具,因此必须掌握好它们的用法。java

        好了,三管齐下,一块儿比较地举例子说一下:git

//先来一个对象big吧
var big = {
    name:'BaBa',
    saying:function (age){
        console.log(this.name,'age:',age);
    }
};

//再来一个small对象
var small= {
    name:'ErZi'
};

//若是想调用big的saying方法来讲出‘Erzi’:
//使用bind方法
big.saying.bind(small)(20);//打印结果为ErZi age: 20
//使用call方法
big.saying.call(small,20);//打印结果为ErZi age: 20
//使用apply方法
big.saying.apply(small,[20]);//打印结果为ErZi age: 20

        因此,其实三种方法均可以达到同一个结果,至于区别就很显而易见了。github

        bind只是单纯将一个函数里的this的指向明确指定为small了,若是要执行函数,就要在后面加括号调用了。数组

        call就是直接执行一个本身指定this指向的函数,参数是一个一个传递。app

        apply和call的区别就是,参数是放进一个数组中传递。函数

        实际上,不少时候咱们在一个函数中,想用到其余的函数,可是其余函数的this指向就不明确,因此就会在本身的函数里面经过这三个方法来调用函数,例如:工具

//先来一个对象big吧
var big = {
    name:'BaBa',
    age:50,
    saying:function (){
        console.log(this.name,'age:',this.age);
    }
};

//再来一个SayingAge的构造函数
function SayingAge(name,age){
    this.name = name;
    this.age = age;
    this.saying = big.saying.bind(this);
}

//实例化一个对象genius
var genius = new SayingAge('tiancai',18);
//调用genius的saying方法
genius.saying();//打印结果为tiancai age: 18

        构造函数SayingAge就是将big的saying方法拿过来,并将saying函数里面的this指向改成本身的this指向(指向实例化的对象)。this

        若是想不仅仅是bind了一个函数的this指向,还想执行它,举个call的例子(apply只是将参数放进数组):code

//先来一个对象big吧
var big = {
    name:'BaBa',
    age:50,
    saying:function (sex){
        console.log(this.name,'age:',this.age,'sex:',sex);
    }
};
//再来一个small对象
var small = {
    name:'ErZi',
    age:18
};
//借用big的saying方法看看small的saying是什么
big.saying.call(small,'male');//打印结果为ErZi age: 18 sex: male

        固然了,这个方法并无给small添加了saying方法,只不过调用了big的saying方法,并将里面的this指向small而已。

        相信你们对这三个方法的应用都很轻松掌握了。

相关文章
相关标签/搜索