apply和call的使用和区别
apply :
Function.apply(obj, args)接收两个参数:
obj: 改变Function的this指向,使其指向obj;
args: 传入给函数的数组参数;
call:
Function.call(obj, param1, param2, param3...)
obj: 改变Function的this指向,使其指向obj;
args: 传入给函数的数组参数;
实例:
function add(c, d) { return this.a + this.b + c + d; } var strObj = { a: '今天', b: '天气'}; console.log(add.apply(strObj, ['真', '好'])); // 今天天气真好 console.log(add.call(strObj, '真', '好')); // 今天天气真好
apply和call的区别:
-
参数的传入形式不同:
apply的只有两个参数,第一个参数是this指向的对象,第二个参数是传入Funtion的参数组成的数组;
call有一个及以上的参数, 第一个参数是this指向的对象,后面的参数均是传入Function的参数,有两个就是传给Function两个参数,有三个就是传了三个,有几个传几个;
-
使用场景不同:
若参数的形式是数组类型,且在调用时,参数的顺序一致(不出现乱换参数位置的情况),比如:父函数是Person(name, age) 子函数Student(name, age, grade),就可以使用apply;
若参数顺序不一致,比如:父函数 Person(name, age)子函数 Student(age, name, grade),就可以使用call,指定参数对应值的位置(Student.call(this, name, age, grade));
apply和call可用于继承
function Class10(){ this.showSub = function(a,b){ alert(a - b); } } function Class11(){ this.showAdd = function(a,b){ alert(a + b); } } function Class12(){ Class10.apply(this); Class11.apply(this); // Class10.call(this); //Class11.call(this); } var c2 = new Class12(); c2.showSub(3,1); //2 c2.showAdd(3,1); //4