在javascript中实例化新类时,什么';不给变量赋值有什么害处?

在javascript中实例化新类时,什么';不给变量赋值有什么害处?,javascript,class,Javascript,Class,因此,假设我有一个类(不是一个很好的示例,但它可以用于此目的): 我想创建它的一个实例,所以我通常会这样做: var apple = new Apple(); 但是,在我的场景中,因为实例将立即执行,所以我不需要变量,所以我只想执行以下操作: new Apple(); 我知道这是可能的,但我不知道javascript在幕后会做什么。它会创建内存引用吗?它会将一些令牌放入全局变量中吗?或者它只是运行一个一次性执行的类实例 本质上,我是在问,仅仅使用“new Apple();”有什么害处 更新

因此,假设我有一个类(不是一个很好的示例,但它可以用于此目的):

我想创建它的一个实例,所以我通常会这样做:

var apple = new Apple();
但是,在我的场景中,因为实例将立即执行,所以我不需要变量,所以我只想执行以下操作:

new Apple();
我知道这是可能的,但我不知道javascript在幕后会做什么。它会创建内存引用吗?它会将一些令牌放入全局变量中吗?或者它只是运行一个一次性执行的类实例

本质上,我是在问,仅仅使用“new Apple();”有什么害处

更新

由于这显然是太含糊不清,无法得到我所寻求的建议,让我更具体一点。在我的公司,我们对javascript文件使用标准的分类结构,只是为了保持一致性。这就是我所说的结构(请注意,您使用的是来自的类设计):


有时,MyClassName不需要分配给变量,因为其目的是让init方法开始整个过程,而不是lint使用“new MyClassName();”作为一个错误,核心Javascript将做什么是我的最终问题。

大多数JS linter将标记实例化一个类,而不将其分配给变量或属性,因为它表明:

  • 你犯了一个错误,实际上需要一个推荐人,或者
  • 您调用构造函数是因为它的副作用(这里就是这种情况),在这种情况下,最好还是调用函数
在后一种情况下,很可能(尽管这取决于JS环境),您正在通过实例化一个不引用的对象来分配不使用的内存。在构造函数中产生副作用通常也是一个坏主意(尽管这是一种观点),因为它们破坏了开发人员对创建实例的期望,并且可能导致难以发现的bug。将副作用代码放入方法并调用它通常更简单:

function Apple (type) {
   this.getInfo = function() { 
       alert('this apple is green');
   };
}

var a = new Apple();
a.getInfo();

大多数JS linter将标记实例化类而不将其分配给变量或属性,因为它指示:

  • 你犯了一个错误,实际上需要一个推荐人,或者
  • 您调用构造函数是因为它的副作用(这里就是这种情况),在这种情况下,最好还是调用函数
在后一种情况下,很可能(尽管这取决于JS环境),您正在通过实例化一个不引用的对象来分配不使用的内存。在构造函数中产生副作用通常也是一个坏主意(尽管这是一种观点),因为它们破坏了开发人员对创建实例的期望,并且可能导致难以发现的bug。将副作用代码放入方法并调用它通常更简单:

function Apple (type) {
   this.getInfo = function() { 
       alert('this apple is green');
   };
}

var a = new Apple();
a.getInfo();

人们已经讨论了为什么你不应该这样做,所以我会说实际发生了什么。由于您的对象使用
将创建一个新的内存引用。假设您没有将该引用传递给任何对象(即,在另一个对象或闭包上下文中存储对该对象的引用),并且它没有引用任何外部持久值(在其他地方使用的闭包上下文中的任何值),那么它将在下一个垃圾收集周期中被收集

但大多数Javascript引擎都遵循类似的模型


TL;DR这被认为是不好的做法,但假设您不存储对新对象的任何引用,您的磨损情况不会变得更糟。

人们已经讨论了为什么不应该这样做,所以我将说明实际发生的情况。由于您的对象使用
将创建一个新的内存引用。假设您没有将该引用传递给任何对象(即,在另一个对象或闭包上下文中存储对该对象的引用),并且它没有引用任何外部持久值(在其他地方使用的闭包上下文中的任何值),那么它将在下一个垃圾收集周期中被收集

但大多数Javascript引擎都遵循类似的模型


TL;DR这被认为是不好的做法,但假设您不存储对新对象的任何引用,您的磨损不会更严重。

为什么不将其作为一个函数呢?As@DanielA.White这意味着您可能应该只拥有一个函数。此外,您可能会引入内存泄漏,特别是在构造函数中有任何闭合变量的情况下。这是一个过于简单的示例,而不是我实际想要编写的代码。在实践中,我使用John Resig的简单类继承设计,但在某些情况下,我不需要引用变量,所以我不想让某个全局变量毫无意义地存在。为什么不将其设置为函数?As@DanielA.White这意味着您可能只需要一个函数。此外,您可能会引入内存泄漏,特别是在构造函数中有任何闭合变量的情况下。这是一个过于简单的示例,而不是我实际想要编写的代码。实际上,我使用的是John Resig的简单类继承设计,但在某些情况下,我不需要引用变量,所以我不想让某个全局变量无效。因此,对于更复杂的示例,是否最好将调用封装在函数中,比如function(){var a=new Apple();}();与其将其留在全局范围内,或只是将其分配给变量,这也是一个lint错误,原因相同(未使用的变量)。最好不要在构造函数中产生任何副作用,或者将构造函数变成函数。因此,对于更复杂的示例,最好将调用封装在函数中,例如function(){var a=new Apple();}();与其将其留在全局范围内,或只是将其分配给变量,这也是一个lint错误,原因相同(未使用的变量)。最好不要有副作用
function Apple (type) {
   this.getInfo = function() { 
       alert('this apple is green');
   };
}

var a = new Apple();
a.getInfo();