关于call()

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

输出3次[object Window]。因为,在function中没有定义函数的作用域,输出的this表示window对象。

var each=function(arr,fn){
  let i=0,len=arr.length;
  for(;i

输出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

你可能感兴趣的:(关于call())