前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >彻底理解了call()方法,apply()方法和bind()方法

彻底理解了call()方法,apply()方法和bind()方法

作者头像
小周sir
发布2019-09-23 16:09:35
5770
发布2019-09-23 16:09:35
举报
文章被收录于专栏:前端技术开发

javascript中的每一个作用域中都有一个this对象,它代表的是调用函数的对象。在全局作用域中,this代表的是全局对象(在web浏览器中指的是window)。如果包含this的函数是一个对象的方法,this指向的就是这个对象。因此在上面例子中就不用直接写对象的名字,而是使用this代替它,例如:

代码语言:javascript
复制
var human = {
    name: '霍林林',
    sayName: function(){
        console.log(this.name);

    }
}

human.sayName();

下面这个例子中,我们直接使用person.name,这种做法会增加方法与对象之间的耦合度(它们之间的依赖性变强了)。这样写是有问题的 ,如果我们的变量名修改了,我们必须同时修改方法中的变量名。幸运的是,JavaScript给我们提供了解决这个问题的方法。

代码语言:javascript
复制
var person = {
        name: '霍林林',
        sayName: function(){
            console.log(person.name);
        }
    }

    person.sayName();

1.改变this

this通常是被自动赋值的,但是我们可以改变this的指向。JavaScript给我们提供了 3 中 函数方法 来改变this的指向。

2.call()方法

这个方法的第一个参数表示this指向的对象,后面的所有参数都是函数的参数。例如:

代码语言:javascript
复制
function sayName(label) {

    console.log(label+'--->'+this.name);

}


var name = '张三';

var person1 = {
    name: '李四'
};


var person2 = {
    name: '王二'

};
sayName.call(window,'global');      //'global--->张三'
sayName.call(person1,'person1');    //'person1--->李四'
sayName.call(person2,'person2');    //'person2--->王二'

3.apply()方法

這個方法和call方法的作用都是相同的,只不过在传递参数时候,call方法可以传递多个参数,而apply方法只能传递一个方法,并且要求是一个数组。

代码语言:javascript
复制
function sayName(label) {

    console.log(label);
    console.log(this.name);

}


var name = '张三';

var person1 = {
    name: '李四'
};


var person2 = {
    name: '王二'

};
sayName.apply(window,['global']);   //'global--->张三'
sayName.apply(person1,['person1']); //'person1--->李四'
sayName.apply(person2,['person2']); //'person2--->王二'

4.bind()方法

bind()方法第一个参数是我们希望函数中this指向的对象,后面的参数是我们希望给函数的参数绑定的值。

代码语言:javascript
复制
var obj = {
              name:'小明'
              age:23
            };
function myName(age,gender){
              console.log(this.name,age,gender);
            }
var newName = myName.bind(obj);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-09-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.改变this
  • 2.call()方法
  • 3.apply()方法
  • 4.bind()方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档