JavaScript中的call,apply,bind

call

作用:改变this指向
传参:参数用逗号隔开

//普通函数调用this指向window
var addr = 'earth'function fn(){
    var addr = 'china';
    console.log(this.addr);
};
fn();  //earth
  • 用call改变this指向
//普通函数调用this指向window
var addr = 'earth'function fn(){
    var addr = 'china';
    console.log(this.addr);
};
fn.call({addr:'usa'});   //usa , 将fn的this指向{addr:'usa'},并且调用fn函数
  • 用call改变this指向并且向函数传入参数
function fn(b,c){
    console.log(this.a + b + c)
};
fn.call({a:1} , 2 , 3)   //6
  • 通过call让类数组借用真数组的方法
//具备索引和length,是一个类似于数组的对象,但是对象没有push,shift等数组的方法,但是可以通过call借用
var not_arr = { 0:'a' , 1:'b' , 2:'c' , length:3 };  

Array.prototype.push.call( not_arr , 'd' );
console.log(not_arr) ; //{ 0:'a' , 1:'b' , 2:'c' , 3:'d' , length:4 }
Array.prototype.push  的意思是通过数组的原型找到push方法,也可以[].push.call(),只要找到push即可。
然后改变push的this指向,让其指向not_arr对象
  • 用call改变方法调用里的this并且传入参数
var tools = {
    num:100,
    fn:function(b,c){
        console.log(this.a + b +c);
    }
}
tools.fn.call({a:1} , 2 , 3)   //6
  • 用call实现借用构造函数继承
//定义一个人类,具有名字,年龄,住址的属性
function Person(obj){
    this.name = obj.name ;
    this.age = obj.age ;
    this.addr = obj.addr;
};
Person.prototype = {  } ;

//定义一个学生类,该学生类同样有名字,年龄,住址的属性,另外还有一个班级属性我们可以让学生
类的构造函数里的属性继承自Person,做法就是执行Person函数并且将其this指向Student的实例
function Student(obj){
    Person.call(obj);
    this.class_name = obj.class_name ;
};
Student.prototype = {  } ;

var tom = new Student({name:'tom',age:18,addr:'usa',class_name:3});
console.log(tom.name , tom.age , tom.addr);  //tom 18 usa

apply

apply和call的唯一区别是apply在传入参数的时候必须是数组或伪数组的形式

var tools = {
    num:100,
    fn:function(b,c){
        console.log(this.a + b +c);
    }
}
tools.fn.apply({a:1} , [2,3] );   //6

call和apply指向设为null

则函数内部this指向为window或者global

bind

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值