在查看一些源代码时,我发现了这一点:
require["./helpers"] = new function() {...};
为什么new
在这里被使用?当我在 JSLint 上运行它时,我得到
Weird construction. Delete 'new'.
那么这只是一种风格,个人喜好吗?或者这背后有什么东西?
在查看一些源代码时,我发现了这一点:
require["./helpers"] = new function() {...};
为什么new
在这里被使用?当我在 JSLint 上运行它时,我得到
Weird construction. Delete 'new'.
那么这只是一种风格,个人喜好吗?或者这背后有什么东西?
这是一种创建对象的方法,允许this
在创建过程中使用。
这在对象文字语法不允许的实例化期间提供了对对象的一些直接引用。
var o = new function() {
this.num = Math.random();
this.isLow = this.num < .5; // you couldn't reference num with literal syntax
};
对象文字版本需要如下所示:
var o = {
num: Math.random()
};
o.isLow = o.num < .5;
所以匿名函数基本上是用作临时构造函数的。我们可以很容易地使用一个命名的构造函数,但是由于我们并不真正关心构造函数,我们只使用一个“一次性”的。
当然,由于它是一个函数,它会创建一个局部变量范围,因此如果您将任何函数分配给新对象,它们将能够关闭局部变量。
它基本上与 IIFE 做同样的事情,它返回某种公共接口(一个具有公共属性/方法的对象,可以访问函数的私有范围),除了那些在构建过程中真的非常想使用的人this
, 并且懒得使用call
,bind
或apply
, 或者直接返回一个常规的内联对象。
在幕后,IIFE 和构造函数之间存在一些差异,当两者都以预期的方式使用时......但在这种情况下,无论哪种方式,最终返回值实际上并没有任何本质上的不同,从高层次(即:就您的程序而言)。