Function.prototype.call或是Function.prototype.apply都是非常非常常用的方法,他们的作用也是一样的,区别就在于传入的参数是不一样的。
apply接受两个参数,第一个参数指定了函数体内部的this对象的指向,第二个参数是一个带下标的集合,这个集合可以是数组也可以是类数组,apply方法把这个集合中的元素做为参数传递给调用的函数。
var func = function ( a , b , c ){
alert([ a , b , c ]) // [1 , 2 , 3]
}
func.apply(null , [1 , 2 , 3])
call传瑞的参数的数量是不固定的,和apply相同,第一个参数代表函数体内部的this的指向,从第二个参数开始,每一个参数会依次的传入函数中。
call是包装在apply上面的语法糖,如果我们明确的知道函数接受多少个参数,还是应该选择实参和形参一一对应。
当我们使用call和apply的时候,我们第一个传入的参数是null,函数体的this会指向默认的宿主对象,在浏览器中就是window
call和apply的用途
1.改变this的指向
var obj1 ={
name : 'kim'
}
var obj2 = {
name :'john'
}
window.name = 'window';
var getName = function(){
console.log(this.name);
}
getName(); //window
getName.call(obj1); // kim
getName.apply(obj2); //john
借用其他对象的方法
‘借用构造函数’,实现类似继承的效果
var A = function(name){
this.name = name
};
var B = function(){
A.apply(this ,arguments);
}
B.prototype.getName = function(){
return this.name;
};
var b = new B('kim');
console.log(b.getName()); //kim
网友评论