Study《javaScript中的call和apply》

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属性.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值