在制作javascript类函数时,我经常使用this.
。但是在使用它时,它让我怀疑使用var
是否会产生影响。
var myClass = function() {
this.x = 4;
return {
getVal: this.x
};
}
与使用var
相同var myClass = function() {
var x = 4;
return {
getVal: x
};
}
区别是什么,我什么时候应该使用它们?
答案 0 :(得分:7)
this
变量变为public
变量,var
变量变为private
变量。
使用this
关键字声明的变量或函数成为类的实例成员,这意味着它们将在每个新创建的该类实例中可用。当您使用this
时,您已经创建了一个类,您需要使用new
关键字对其进行实例化,如下所示。
示例:强>
function Foo() {
// private var
var bar = 'I am bar';
// public var
this.baz = 'I am baz';
}
var f = new Foo;
console.log(f.bar); // undefined
console.log(f.baz); // I am baz
在制作javascript类函数时,我正在使用它。很多。但 在使用它时,它让我想知道它是否会成为一个 改为使用var的差异。
存在显着差异,除非另有需要,否则不应使用this
关键字创建不希望出现在类实例中的变量。这只是创造了一个开销,并且正如Crockford所说的那样计算浪费。
答案 1 :(得分:1)
您可以this.x
访问myClass.x
,但var x
案例不能这样做。这完全是关于封装。
答案 2 :(得分:1)
如果你不需要继承,闭包(var case)和对象(这种情况)基本上做同样的事情并且是roughly interchangeable。
要记住的差异:
当你使用“this”时,需要使用“new”调用构造函数,如果将它们存储在变量上或者将它们作为回调传递,则需要使用.call调用方法。
< / LI>如果你实例化大量对象可能会有性能差异(当前引擎可能会更好地使用对象 - 但只有当你将方法放在原型中而不是在构造函数中设置它们时)
使用“var”声明的变量是私有的,无法在函数外部访问。有时候这没关系,但是这可以阻止你做继承(没有“在Javascript中受保护”的概念)
答案 3 :(得分:1)
this:x
就像实例变量一样。这些变量具有公共范围。在OOP中作为类变量工作。
虽然var x;
的范围有限。这些变量的行为类似于私有变量,可在本地范围内访问。