js call、apply使用总结

js call、apply使用总结
一、call、apply 语法介绍
  • apply() :调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
    语法:apply([thisObj [,argArray] ]);

    说明:如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

  • call() :使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。
    语法:call([thisObject[,arg1 [,arg2 [,…,argn]]]]);

    说明:call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

    注意:call()方法的作用和 apply() 方法类似,区别就是call()方法接受的是参数列表,而apply()方法接受的是一个参数数组。

二、call、apply 用法

举例说明:

  1. 实现继承

    function Person(name,age){
    	this.name = name;
    	this.age = age;
    }
    
    function Student(name,age){
    	Person.call(this,name,age);
    	this.class = '三年级一班';
    	console.log(this.name+' '+this.age+' '+this.class);
    }
    
    function teacher(name,age){
    	Person.apply(this,[name,age]);
    	this.work = '教育学生';
    	console.log(this.name+' '+this.age+' '+this.work);
    }
    
    var stu = new Student('小明',16);  //打印出 : 小明 16 三年级一班
    var th = new teacher('王老师',50);  //打印出 : 王老师 50 教育学生
    
    console.log(stu,th); 
    //Student {name: "小明", age: 16, class: "三年级一班"} teacher {name: "王老师", age: 50, work: "教育学生"}
    
  2. 改变 this 指向

    function greet(a,b){
    	var reply = [this.person,'Is An Awesome',this.role,a,b].join(' ');
    	console.log(reply);
    }
    
    var man = {
    	person:'Json',
    	role:'engineer'
    }
    
    greet.call(man ,'first','end');  //打印出 Json Is An Awesome engineer first end
    greet.apply(man ,['first','end']);  //打印出 Json Is An Awesome engineer first end
    
  3. 调用匿名函数

    function carColor(){
    	var car = [
    		{brand:'BMW', color:'white'},
    		{brand:'Benz', color:'black'}
    	];
    	
    	for(var i=0;i<car.length;i++){
    		(function(i){
    			console.log(i+':'+this.brand+' is '+this.color);
    		}).call(car[i],i+1);
    	}
    }
    carColor(); //输出结果:1:BMW is white  2:Benz is black
    //此例中若使用 apply 改变指向,在 call 处这么写: apply(car[i],[i+1]) 即可;
    

通过上面的例子说明,call、apply的使用方式基本一样,只是传入参数的方式不同。

当你不会使用某个 “工具” 时,请先学着适应它,时间久了感觉就来了,加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值