call,apply学习小结
之前一直不太清楚js的call,apply的作用是什么,直到看到了这篇博文
http://blog.csdn.net/myhahaxiao/article/details/6952321
1 function Person(name,age) 2 { 3 this.name=name; 4 this.age=age; 5 } 6 7 function Student(name,age,grade) 8 { 9 Person(name,age); 10 Person.call(this,name,age); 11 alert(window.name); 12 this.grade=grade; 13 } 14 var student=new Student("zhangsan",21,"一年级"); 15 alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);
为什么用Person.call,而不是直接调用Person函数呢?直接用Person(name,age);这里给this赋值,this是window,最后window拥有了name跟age值;
原因是this的指向,函数作用域取决于定义它时所在的地方,而不是执行它时所在的地方。这里Person函数是在全局环境下定义的,所以this变成了window;
而Person.call(this,name,age);的作用是将Person函数的作用域变成了当前函数,所以最终生成的实例student拥有了name跟age值,所以call的作用是可以改变函数的作用域,下面这个例子也说明了这一点:
1 var name="CC"; 2 function Person(name) 3 { 4 alert(name); 5 } 6 7 function Student() 8 { 9 var name="AA"; 10 Person.call(this,name); 11 } 12 var student=new Student();
最终弹出的是AA!
至于apply的妙用可以参考链接。