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 用法
举例说明:
-
实现继承
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: "教育学生"}
-
改变 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
-
调用匿名函数
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的使用方式基本一样,只是传入参数的方式不同。
当你不会使用某个 “工具” 时,请先学着适应它,时间久了感觉就来了,加油!!!