Study《javaScript中的call和apply》
在网上找了一圈,发现都是拿来主义(中国程序员的悲哀)。
现把自己的心得总结如下:
首先:call和apply方法基本上是一个意思,区别在于:
call的第二个参数可以是任意类型
apply的第二个参数必须是数组(正好可用于arguments)
下面只讲一下call,就是改变this指针:
eg:
a.call(b):在执行中改变a中this指针为b
a.method.call(b):在执行中改变a.method中this指针为b
一、简单的例子
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);//结果为4
分析原因:
执行add方法时内部this为window;执行add.call(sub)时内部this为sub,
但在add中没有用到this,所以结果还是传入的3+1.
再看下面
function A(){
this.name = "a";
this.age = 17;
this.show = function(){
alert(this.name + ";" + this.age);
}
}
function B(){
this.name = "b";
}
var a = new A();
var b = new B();
a.show.call(b);//结果b;undefined
分析原因:
执行a.show时内部this为A;执行a.show.call(b)时内部this为b,
所以此时this.name为b.name;this.age为b.age,但b中没有age属性,
只有返回undefined了.
明白了上面之后请分析下面的结果并考虑为什么?
var value = "global var";
function mFunc(){
this.value = "member var";
}
function gFunc(){
alert(this.value);
}
window.gFunc();
gFunc.call(window);//global var
gFunc.call(new mFunc());//member var
二、解决问题
function t(){
this.a = "a";
this.b = "b";
}
function t2(){
alert(this.a);
}
var temp = t();
alert(a+";"+b);//a;b
t2.call(temp);//a
why执行上面之后a和b成了全局变量?
分析原因:
执行temp=t()时t中的this为window,所以a和b都成了全局变量了。
执行t2.call(temp)时temp没有返回值(undefined)等效于
t2.call(undefined),等效于t2.call(window),所以t2中的this.a为全局变量a.
三、call应用
function Person(){
this.initialize.apply(this,arguments);//call
}
Person.prototype = {
initialize:function(obj1,obj2){
this.obj1 = obj1;
this.obj2 = obj2;
},
showSelf:function(){
alert("obj:" + this.obj1 + ";" + this.obj2);
}
}
var person = new Person("man","women");
person.showSelf();//man;women
alert(person.obj1);//man
分析:
执行this.initialize.apply时把this.initialize中的this变为Person中的this,
也就是提升了initialize中this到Person,所以Person中具有obj1和obj2属性.