我什么时候应该使用“this.x”与“var x”

When should I use `this.x` vs. `var x`?

本文关键字:this var 什么时候      更新时间:2023-09-26

在制作JavaScript类函数时,我正在使用this。好多。但是在使用它时,这让我想知道使用var是否会有所作为。

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

与使用var相同:

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

有什么区别,我应该什么时候使用哪个?

同样的问题也适用于class语法:

class MyClass {
  constructor(){
    const x = 4;
  }
}

class MyClass {
  constructor(){
    this.x = 4;
  }
}

具有this的标识符成为公共属性,而具有var的标识符成为私有变量。如今,应该使用const而不是var;如果无法对特定变量使用 const,请改用let。访问语义是相同的。

将标识符与 this 关键字(如 this.x = 4;)一起使用时,您将设置一个属性,其中包含键"x"this 引用的对象上的值4。由于this引用类上下文中的实例,因此此类属性将成为类的实例成员,这意味着它们将在该类的每个新创建的实例中可用。当你使用 this 时,这意味着你打算在类中使用它,所以你需要使用 new 关键字实例化它,如下所示。

function Foo() {
  // Variables, scoped to the function. Private access.
  const bar = 'I am bar';
  
  // Properties, set on the instance. Public access
  this.baz = 'I am baz';
  this.secretBar = () => `It’s a secret to everybody: ${bar}.`;
}
const f = new Foo();
console.log(f.bar); // undefined
console.log(f.baz); // "I am baz"
console.log("bar" in f); // false; f does not have the property "bar".
console.log(f.secretBar()); // "It’s a secret to everybody: I am baz.";
  // `secretBar` is in the scope of `Foo`, so it has access to its variables.

在制作 JavaScript 类函数时,我使用的是 this .好多。但是在使用它时,这让我想知道改用var是否会有所作为。

两者之间存在显着差异。除非另有需要,否则不应使用 this 关键字创建不希望出现在类实例中的变量。

您可以使用

myClass.x访问this.x,但对于var x情况,您不能这样做。这都是关于封装的。

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

要记住的差异:

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

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

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

this.x这样的表达式指的是属性;它们就像实例变量。这些变量具有公共范围。它们在面向对象编程中用作类变量。

另一方面,var x;的范围有限。这些变量的行为类似于私有实例变量,并且可以在本地范围内访问。