2014-12-23 143 views
0

我有这个简单的Javascript代码编写一些模块,但我不知道为什么我得到的,即使我从内调用该函数不确定的结果:为什么这个JavaScript类返回undefined

window.onload = function() { 
    function testFunction() { 
     this.hours = null; 
     function getHours() { 
      return this.hours; 
     } 

     alert(getHours()); 
     return { 
      getHours: function() { 
       return getHours(); 
      } 
     } 
    } 

    var test = new testFunction(); 
    alert(test.getHours()); 

} 

我认为我在理解javascript中的THIS关键字方面存在问题,并在javascript构造函数中使用它。

谢谢。

+1

你的'getHours'函数中的'this'与它之外的'this'是不一样的。 –

+0

@VsevolodGoloviznin有什么不同?我真的想明白这一点!谢谢你的评论。 – Mohammad

+0

@Mohammad这很简单 - 如果你调用'obj.myFunc()',那么'this === obj'。但是如果你只是调用'myFunc()'然后调用'this === window''(或ES5严格模式中的'null'!) – Alnitak

回答

1

你(初始)问题是在这里:

return { 
    getHours: function() { 
     return getHours(); 
    } 
} 

通过使“裸”调用getHours()这个功能里面你失去任何this情况下,你有。

相反,这样做:

return { 
    getHours: getHours 
} 

即返回包含所需要的功能的基准的对象。当您拨打test.getHours()时,它会正确地将test作为this传递到getHours

的另一个问题是,因为你使用return,露出了一组功能,即返回的对象变成了新建成的this不再是指您添加到hoursthis

这是两个(或更多)JS OOP技术的不幸混杂,它们彼此冲突。

+0

Samething!未定义的结果! – Mohammad

+0

好的 - 还有其他的东西在播放 - 让我检查 – Alnitak

+0

对,你应该使用'var hours',而不是'this.hours'。 – Alnitak

1

那么,想想“这”指的是什么。第一个指向它所在的函数“testFunction()”。第二个指向它所在的函数,“getHours()”,但是你定义了getHours两次,并且第二次返回的是未定义的,因为你不再拥有“this”。默认情况下,当没有你想要返回的东西时,javascript返回“undefined”。在我写这篇文章时,我注意到另一个提出解决问题的答案,所以我不会在此重复。

相关问题