6

在制作 javascript 类函数时,我使用this.了很多。但是在使用它的同时,它让我想知道它是否会有所作为var

var myClass = function() {
    this.x = 4;
    return {
        getVal: this.x
    };
}

与使用 var 做同样的事情

var myClass = function() {
    var x = 4;
    return {
        getVal: x
    };
}

有什么区别,我应该什么时候使用它们?

4

4 回答 4

8

带有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 所说的计算浪费。

于 2012-06-22T18:28:20.257 回答
1

您可以使用 访问this.xmyClass.x但您不能这样做var x。这都是关于封装的。

于 2012-06-22T18:24:02.603 回答
1

如果你不需要继承,闭包(var 情况)和对象(this 情况)基本上做同样的事情并且大致可以互换

要记住的差异:

  • 当您使用“this”时,需要使用“new”调用构造函数,如果将方法存储在变量中或将它们作为回调传递,则需要使用 .call 调用方法。

  • 如果您实例化大量对象,可能会有性能差异(当前引擎可能更好地使用对象 - 但前提是您将方法放在原型中而不是在构造函数中设置它们)

  • 用“var”声明的变量是私有的,不能在函数外访问。有时这没问题,但这可能会阻止您进行继承(没有“在 Javascript 中保护”的概念)

于 2012-06-22T18:28:38.140 回答
1

this:x就像实例变量。这些变量具有公共范围。在 OOP 中用作类变量。

虽然var x;范围有限。这些变量的行为类似于私有变量,并且可以在本地范围内访问。

于 2012-06-22T18:34:58.650 回答