大话前端Web 前端开发 程序员

关于call()

2018-01-16  本文已影响4人  fenerchen

JavaScript中的call方法call(object,a1,a2,,,),有两个作用:
1、继承
2、修改函数运行时的this指针

一、继承

function a(){
  this.x=1;
}
function b(){
  console.log(this);
  a.call(this);
  console.log(this);
}
var bb=new b()

上述代码输出

 b {}
 b {x: 1}

说明 a.call(this);中的this代指b,b把a中定义的属性又走了一遍,相当于继承了a。

二、修改函数运行时的指针

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
上一篇 下一篇

猜你喜欢

热点阅读