2017-01-23 81 views
-2

应该'这个'。或'var'用于在Javascript类中创建变量,或者使用哪个变量无关紧要。显然那些与此定义。可以从对象外部访问,而用var定义的那些不会但是还有其他区别吗?Javascript类变量 - 这个。或var

function myClass() { 
 
\t this.count = 0; 
 
\t this.oTimer = null; 
 
    this.getCount = function() { return(this.count); } 
 
} 
 
oMyObj = new myClass(); 
 
oMyObj.getCount(); // returns 0

,而不是

function myClass2() { 
 
\t var count = 0; 
 
\t var oTimer = null; 
 
    this.getCount = function() { return(count); } 
 
} 
 
oMyObj = new myClass2(); 
 
oMyObj.getCount(); // returns 0

+2

'var'使计数隐藏。对于'this.count',您可以通过执行'oMyObj.count'来访问计数。阅读关于JavaScript作用域和闭包。 –

+0

词汇范围界定我的朋友:) – jdmdevdotnet

+2

它完全取决于你想要的可见性。 “this”的使用意味着“它是这个班级的明显成员”。它还将该意图传达给其他开发人员。使用“var”意味着“不要在外面使用”(并再次传达该意图)。但是,请注意,在JavaScript中,最终通常可以获取任何数据,而不管开发人员如何试图隐藏它。模块模式等可以很好地解决编译时违规等问题,但是好的括号符号几乎胜过任何东西。 –

回答

2

试图解释一下更详细的比多米尼克的评论:

如果您使用var关键字,则该变量仅在其运行范围内有效。这意味着在构造函数运行后(函数体),变量会丢失(因为它们只在构造函数中有效)。

如果您想访问构造函数以外的变量(例如member-methods),您必须通过关键字this将变量绑定到类本身。现在他们的范围是类本身,而不仅仅是构造函数。


编辑:

进一步解释:虽然您可以使用与var的方法里面,你也构造函数中的声明,因为它们是在同一范围内(见例问题的)定义声明的变量,无法通过其他通过Function.prototype添加的其他方法访问它们。

为了证明这一点,我创建了一个小JSFiddle example

所以它通常更好的做法定义与一类的所有变量(即你不仅使用在构造函数中的临时变量的意图) this关键字。

+0

Michael,刚刚测试了这个理论,但似乎用var声明的变量实际上对成员方法是可见的,就像那些用这个声明的变量一样。将编辑原始文章中的示例进行演示。 – NickC

+1

@NickC是的,但那只是因为你在相同的作用域(构造函数)中定义了方法。看看这个小提琴,我尝试了另一种添加成员方法的方法(通过原型):https://jsfiddle.net/oo2gamzn/1/。虽然在定义函数体内部的方法时它可能与变量一起工作,但是对于在构造函数 –

+0

Michael之外使用的变量使用'this'通常是更好的做法,感谢那个完全解释不同之处的jsfiddle,现在我明白了。我有一种感觉存在差异,但无法理解它是什么。欢呼声, 如果您想重复作为答案,我可以将其标记为接受的解决方案。 – NickC