理解JavaScript中的call和apply方法
call方法
总的来说call()有这几种作用:1.可以借用另一个对象的方法。2.改变this的指向(重要)。3.将arguments数组化。下面详细介绍这三种作用:
1.可以借用另一个对象的方法:当一个对象需要借用另一个对象的方法时,此时需要用到call()方法。
1 //对象1 2 var myclass={ 3 getNumbers:function(sum,sum1){ 4 return sum+sum1; 5 } 6 }; 7 //对象2 8 var student={ 9 getDetail:function(){ 10 return {name:'张三',habits:'打篮球'} 11 } 12 }; 13 //借用 14 console.log(myclass.getNumbers.call(student,10,200)); //210
这里student对象想要借用myclass对象中的getNumbers方法,需要借用谁的,就将它写在前头。这样就可以实现调用,需要注意的是函数也是对象,同样可以用call方法。
2.改变this的指向(重要)。
先来看个例子: 1 用户名:<input type=”text” id=“text” value=”张三” />
1 var value="李四"; 2 //函数中默认this指向window 3 function fn1(){ 4 console.log(this.value); 5 } 6 fn1();//李四
可以看出此时要想获得表单中的value值是获取不到的。那要如何才能获取到呢,这时call的作用就体现出来了。可以用以下方式获取:
1 function fn1(){ 2 console.log(this.value); 3 } 4 fn1.call(document.getElementById('text')); //张三
这个时候this指向input元素对象。
总结一下:call是函数下的一个方法,call()方法的第一个参数可以改变函数执行过程中内部this的指向,第二个参数开始就是原来函数的参数列表。
3.将arguments数组化。
这里先简单介绍一下什么是arguments:arguments是一个数组对象,用于保存函数的参数,准确点说应该是一个伪数组,你可以使用arguments对象在函数中引用函数的参数,它只有在代码运行的时候才起作用。如:
1 function add() { 2 var sum = 0, 3 len = arguments.length; 4 for (var i = 0; i < len; i++) { 5 sum += arguments[i]; 6 } 7 return sum; 8 } 9 console.log(add()); // 0 10 console.log(add(1)); // 1 11 console.log(add(1, 2, 3, 4)); // 10
说arguments是一个伪数组,那什么是伪数组,伪数组就是它类似于数组,但除了length属性和索引元素之外没有任何Array
属性,比如没有push方法
改变