call和apply方法

业无高卑志当坚,男儿有求安得闲?这篇文章主要讲述call和apply方法相关的知识,希望能为你提供帮助。
普通函数中是否也有this关键字,this指向谁呢?

< script type="text/javascript"> function myfun(){ console.log(this); } myfun(); < /script>

call和apply方法

文章图片

控制函数内部的this指向:
函数都可以打点调用call()和apply()方法,可以帮我们制定函数内部的this指向,在函数调用过程使用这两个方法。
 
var oDiv = document.getElementsByTagName(\'div\'); function fun(){ console.log(this); } //fun.call(oDiv); fun.apply(oDiv);

 
作用:
  1、执行fun函数
2、在fun函数内部指定this的指向oDiv
 
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
< head>
< meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
< title> Document< /title>
< style type="text/css">
div{
width: 200px;
height: 200px;
background: red;
}
< /style>
< /head>
< body>
< div> < /div>
< /body>
< /html>
< script type="text/javascript">
/*function fun(){
console.log(this);
}
fun(); */
var oDiv = document.getElementsByTagName(\'div\')[0];
/* function fun(){
console.log(this);
}
//fun.call(oDiv);
fun.apply(oDiv); */
/*function sum(a,b){
this.style.backgroundColor = "pink";
}
sum.call(oDiv);
sum.apply(oDiv); */
function sum(a,b){
this.style.backgroundColor = "pink";
console.log(a+b);
}
sum.call(oDiv,2,3);
sum.apply(oDiv,[3,5]);
< /script>
 
call和apply  区别:
函数传递参数的语法不同。
sum.call(oDiv,参数1,参数2,参数3...); sum.apply(oDiv,[参数1,参数2,参数3...])

【call和apply方法】 
  1. 1.apply和call的区别在哪里   
  2.    
  3. 2.什么情况下用apply,什么情况下用call   
  4.    
  5. 3.apply的其他巧妙用法(一般在什么情况下可以使用apply)   
  6.    
  7. 我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用.   
  8.    
  9.                   apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.   
  10.    
  11.   Function.apply(obj,args)方法能接收两个参数   
  12. obj:这个对象将代替Function类里this对象   
  13. args:这个是数组,它将作为参数传给Function(args--> arguments)   
  14.    
  15.                   call:和apply的意思一样,只不过是参数列表不一样.   
  16.    
  17.   Function.call(obj,[param1[,param2[,…[,paramN]]]])   
  18. obj:这个对象将代替Function类里this对象   
  19. params:这个是一个参数列表   
  20.    
  21. 1.apply示例:   
  22.    
  23. < script  type="text/javascript">      
  24. /*定义一个人类*/     
  25. function  Person(name,age)  {     
  26.         this.name=name;   this.age=age;      
  27. }     
  28.   /*定义一个学生类*/     
  29. functionStudent(name,age,grade)  {     
  30.         Person.apply(this,arguments);   this.grade=grade;      
  31. }     
  32. //创建一个学生类     
  33. var  student=new  Student("qian",21,"一年级");      
  34. //测试     
  35. alert("name:"+student.name+"\\n"+"age:"+student.age+"\\n"+"grade:"+student.grade);      
  36. //大家可以看到测试结果name:qian  age:21  grade:一年级     
  37. //学生类里面我没有给name和age属性赋值啊,为什么又存在这两个属性的值呢,这个就是apply的神奇之处.     
  38. < /script>      
  39.    
  40. 分析:  Person.apply(this,arguments);    
  41.    
  42. this:在创建对象在这个时候代表的是student   
  43.    
  44. arguments:是一个数组,也就是[“qian”,”21”,”一年级”];    
  45.    
  46. 也就是通俗一点讲就是:用student去执行Person这个类里面的内容,在Person这个类里面存在this.name等之类的语句,这样就将属性创建到了student对象里面   
  47.    
  48.      
  49.    
  50. 2.call示例   
  51.    
  52. 在Studen函数里面可以将apply中修改成如下:   
  53.    
  54. Person.call(this,name,age);    
  55.    
  56. 这样就ok了   
  57.    
  58. 3.什么情况下用apply,什么情况下用call   
  59.    
  60. 在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的)  就可以采用  apply  ,  如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));    
  61.    
  62. 4.apply的一些其他巧妙用法   
  63.    
  64. 细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this),  第二个参数是一个数组集合,     
  65.    
  66. 在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,   
  67.    
  68. 这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3]  转换为  param1,param2,param3)  这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:   
  69.    
  70.      
  71.    
  72. a)Math.max  可以实现得到数组中最大的一项   
  73.    
  74. 因为Math.max  参数里面不支持Math.max([param1,param2])  也就是数组   
  75.    
  76. 但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决  var  max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项   
  77.    
  78. (apply会将一个数组装换为一个参数接一个参数的传递给方法)   
  79.    
  80.                   这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去   
  81.    
  82. b)Math.min    可以实现得到数组中最小的一项   
  83.    
  84. 同样和  max是一个思想  var  min=Math.min.apply(null,array);    
  85.    
  86. c)Array.prototype.push  可以实现两个数组合并   
  87.    
  88. 同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN)  所以同样也可以通过apply来装换一下这个数组,即:   
  89.    
  90. vararr1=new  Array(

      推荐阅读