JavaScript中的call方法call(object,a1,a2,,,),有两个作用:
1、继承
2、修改函数运行时的this指针
一、继承
function a(){
this.x=1;
console.log(this)
}
function b(){
console.log(this);
a.call(this);
console.log(this);
}
var bb=new b()
上述代码输出
b {}
b {}
b {x: 1}
说明 a.call(this);中的this代指b,b把a中定义的属性又走了一遍,相当于继承了a。
apply也可以实现继承
二、修改函数运行时的指针
var each=function(arr,fn){
let i=0,len=arr.length;
for(;i<len;i++){
fn(i,arr[i]);
}
}
each([1,2,3],function(){
console.log(this.toString())
})
输出3次[object Window]。因为,在function中没有定义函数的作用域,输出的this表示window对象。
var each=function(arr,fn){
let i=0,len=arr.length;
for(;i<len;i++){
fn.call(arr[i]);
}
}
each([1,2,3],function(){
console.log(this.toString())
})
输出1 2 3。说明 fn.call(arr[i],i,arr[i]);将fn方法放到arr[i]
作用域中执行,输出的this表示arr[i].
总结:a.call(this),this所指的作用域继承a,a.call(b)把a的作用域放在b作用域下执行,也就是a.this=b
apply(object,数组)。apply和call的不同之处在于第二个参数是数组。apply的一个妙用是,可以将数组转换成参数列表。
例如,Math.max(num1,num2,...)得用参数列表,很麻烦,用apply可以直接写成数组,便解决这个麻烦
console.log(Math.max.apply(null,[2,4,5]))//输出5,apply第一个参数为null或者没有指向window