当在javascript中实例化一个新类时,不将它分配给一个变量有什么危害?

问题描述:

所以,说我有一个类(不是一个很好的例子,但它适用于这一目的):当在javascript中实例化一个新类时,不将它分配给一个变量有什么危害?

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

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

var apple = new Apple(); 

然而,在我的情况,因为实例将立即执行,我不需要变量,所以我只想做:

new Apple(); 

我知道是可能的,但我不知道是JavaScript将在幕后做什么。无论如何它会创建一个内存引用吗?它会将一些令牌放入全局变量吗?或者它只是运行一次执行类实例?从本质上讲,我在问刚刚使用“新苹果()”的危害是什么?是。

更新

因为这显然是太暧昧让我一直在寻找让我更具体的建议。在我的公司,我们只是为了一致性而使用标准的JavaScript文件分类结构。这是我讲的结构(请注意使用从http://ejohn.org/blog/simple-javascript-inheritance/一流的设计):

MyClassName = Class.extend({ 

    init: function (/*param1, param2, etc*/) { 
     // this method is called immediately when the class is instantiated. 
    }, 
    destroy: function() { 
     // this is your clean up method. 
    } 
}); 

有些时候MyClassName将不需要被分配给一个变量,只是因为其目的是为init方法次开始整个事情,所以短的皮棉拿起“新MyClassName();”的用法是一个错误,JavaScript的核心内容是我的最终问题。

+1

为什么不把它变成一个函数? –

+0

作为@ DanielA.White,这意味着你应该只是有一个功能。此外,你可能会引入内存泄漏,特别是如果你在构造函数内部关闭了变量。 –

+0

这是一个简单的例子,而不是我实际想要编写的代码。在实践中,我使用John Resig的简单类继承设计http://ejohn.org/blog/simple-javascript-inheritance/,但在某些情况下,我不需要永远引用变量,所以我不想有一些全球变数生活没有任何目的。 –

人们已经解决,为什么你不应所以我会说,到底发生了什么。由于您的对象使用this将创建一个新的内存引用。假设您不会将该引用改为任何东西(即将对象的引用存储在另一个对象或封闭上下文中),并且它不引用任何外部持久值(在使用闭包上下文中的任何东西其他地方),那么它将在下一次垃圾收集周期中收集。

This article specifically talks about V8's memory model但是大多数JavaScript引擎都遵循类似的模型。

TL; DR这不是一个好的做法,但假设您没有存储任何对新对象的引用,那么穿上就不会更糟。

大多数JS棉短绒将标志一个类实例化,而不将其分配给一个变量或属性,因为它表明无论是:

  • 你犯了一个错误,而实际需要的引用,或
  • 你”重新调用构造函数的副作用(在这种情况下),在这种情况下,您最好调用一个函数。

在后一种情况下,它很可能(虽然这取决于JS环境),你是分配你将不会被实例化,你不引用一个对象使用的内存。它也是(虽然这是意见)通常是一个糟糕的想法在你的构造函数中有副作用,因为它们会破坏开发人员对创建实例的期望,并且会导致难以发现的错误。它通常是简单的把副作用代码的方法,并调用它:

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

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

所以对于一个更复杂的例子来说,将函数调用放在函数中更好一些,比如说function(){var a = new Apple(); }();而不是把它放在全局范围内,或者只是把它分配给一个变量? –

+0

这也是一个lint错误,出于同样的原因(未使用的变量)。最好不要在构造函数中产生副作用,或者将构造函数变为函数。 – nrabinowitz