Javascript 呼叫';新';在构造函数上,而不将其分配给变量

Javascript 呼叫';新';在构造函数上,而不将其分配给变量,javascript,Javascript,我想知道如果我不需要调用对象上的任何方法,下面的代码中是否有任何区别。我只想实例化它 var router = new Router(); vs 是否允许在构造函数上调用“new”关键字而不将其分配给变量?对象将被实例化,其构造函数中的任何代码都将被执行,是的。之后,对象将被垃圾收集,因为没有任何指向它的引用(禁止在构造函数中使用闭包) 所以,是的,这样做很好。然而,这有点奇怪。如果您只想让代码运行,那么最好使用函数。在您的案例中使用对象几乎毫无意义 或者,如果您的构造函数已经“做得足够多”,

我想知道如果我不需要调用对象上的任何方法,下面的代码中是否有任何区别。我只想实例化它

var router = new Router();
vs


是否允许在构造函数上调用“new”关键字而不将其分配给变量?

对象将被实例化,其构造函数中的任何代码都将被执行,是的。之后,对象将被垃圾收集,因为没有任何指向它的引用(禁止在构造函数中使用闭包)

所以,是的,这样做很好。然而,这有点奇怪。如果您只想让代码运行,那么最好使用函数。在您的案例中使用对象几乎毫无意义


或者,如果您的构造函数已经“做得足够多”,并且您不需要对对象调用其他方法,那么您的构造函数可能做得太多了!考虑重构类并将实例化和启动工作分成两个单独的方法。

< P>如果只调用构造函数而不将其赋给变量,则不能操作对象。


但是,如果您只需要创建一个路由器,然后将其自身挂接到正确的事件中,垃圾收集将不会清理它,它也可以正常工作。

是的,这是可行的。但我想知道你为什么要这么做。您的对象被创建,并且几乎立即被释放(除非创建了一些事件侦听器或进行了其他引用)。代码中显然存在设计缺陷,因为通常只有在打算使用对象时才实例化它

您可能正在执行“单例”模式,但不应通过使用
new
强制执行该模式。在我看来,你应该使用函数来代替

使用
新路由器()

new Router()未链接到任何实例变量。所以你不能访问它的方法。但这并不是使用这种方法的唯一缺点。当GC检查这一行时,没有变量指向这个类并保存它的实例。因此,它将收集所有内存并将其销毁

使用
var路由器=新路由器()


但如果使用var router=new router();然后GC认为这个类有一个活动实例,它会将这个类保存在内存中,而这个实例是活动的。通过设置
undefined
null
或使用
delete
删除该实例时。然后GC会收集该类在该实例中使用的所有内存。

对于2019年阅读此内容的任何人来说,这不仅是完全有效的,而且默认情况下会出现在新生成的vue cli项目中。这背后的主要驱动力是消除代码中的IIFE(无论如何,Webpack都不需要IIFE),并且不污染全局命名空间。

实例化它而不保留对它的引用将导致GC处理它。(除非你不在乎)刚刚在浏览器控制台上尝试了
new Array()
,它成功了(我的意思是它被允许):)这可能会导致什么样的问题?如果你不知道你正在实例化什么,那么它有什么用?只需使用普通函数
router()如果您不需要对象的实例,只需要运行构造函数函数的副作用……如果它是一个路由器,路由在构造函数中定义,eventlisteners也绑定在那里呢?垃圾收集不会启动,因为存在对对象的引用,对吗?
new Router();