首页 新闻 会员 周边

请JS大神帮忙看个关于this的问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-10-17 17:39

var login={
 h:1,
 a:function(){
  return this.h;
 },
 b:function(){
  var c=this.a()+1;
  alert(c);
 }
}
function addLoadEvent(func){
 var oldLoad=window.onload;
 if(typeof window.onload == 'function'){
   window.onload=function(){
     oldLoad();
     func();
    }
  }
  else{
    window.onload=func;
   }
 }
addLoadEvent(login.b);

为什么报this.a() is not a function??

我猜想应该是这个this不是表示login对象,而是window对象了,但是想不通,请大神帮忙解惑下。然后说下常规解决办法。。。

js
少年学编程的主页 少年学编程 | 初学一级 | 园豆:3
提问于:2012-10-12 09:37
< >
分享
最佳答案
0

作用域不同,this.a()指向是当前function的this而不是login的this对象

收获园豆:25
az235 | 大侠五级 |园豆:8483 | 2012-10-15 09:50
其他回答(1)
0

addLoadEvent(function(){login.b();});

收获园豆:25
向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 09:59

我现在就是这么写的。。。。有没有比较好的设计?还是一般都是这么干的?小弟我初来乍到。。。

支持(0) 反对(0) 少年学编程 | 园豆:3 (初学一级) | 2012-10-12 10:06

@少年学编程: 

var login=(function(){
var _this= {
h:1,
a:function(){
return _this.h;
},
b:function(){
var c=_this.a()+1;
alert(c);
}
};
return _this;
})();

addLoadEvent(login.b);

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 10:30

@向往-SONG: 讲讲原因好不。。。。

支持(0) 反对(0) 少年学编程 | 园豆:3 (初学一级) | 2012-10-12 10:39

@少年学编程: 

没啥原因啊,只是把this用_this变量代替了而已,非科班出身不太会理论,只懂做不懂说哈--!

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 10:45

@向往-SONG: 额。。。好吧。我想明白了。。。login.b只是一个函数的地址,我做为直接参数传给addLoadEvent方法后处理为window.onload=login.b,页面加载完后应该是这样调用window.onload()方法,虽然window.onload跟login.b指向的是同一个函数。。。。但是谁调用的this指向谁嘛,所以指向的是window....学习学习

支持(0) 反对(0) 少年学编程 | 园豆:3 (初学一级) | 2012-10-12 10:48

@少年学编程: 

你是说这个啊,你传的是函数,当然跟login对象没关系了,this是指向它调用的对象。

支持(0) 反对(0) 向往-SONG | 园豆:4853 (老鸟四级) | 2012-10-12 10:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册