简体   繁体   中英

Why is new being used with a function expression?

While looking at some source code I found this:

require["./helpers"] = new function() {...};

Why is new being used here? When I run this on JSLint I get

Weird construction. Delete 'new'.

So is this just a form of style, personal preference? Or is there something behind this?

It's a way of creating an object which allows this to be used during the creation.

This offers some direct reference to the object during instantiation that object literal syntax does not allow.

var o = new function() {
    this.num = Math.random();
    this.isLow = this.num < .5; // you couldn't reference num with literal syntax
};

The object literal version would need to look like this:

var o = {
    num: Math.random()
};
o.isLow = o.num < .5;

So the anonymous function is basically used as a temporary constructor. We could just as easily use a named constructor function, but since we don't really care about the constructor, we just use a "disposable" one.

And of course since it's a function, it creates a local variable scope, so if you assign any functions to the new object, they will be able to close over local variables.

It's basically doing the same thing as an IIFE which returns a public interface (an object with public properties/methods which have access to the private scope of the function) of some sort, except for people who REALLY AND DESPERATELY want to use this during the construction, and can't be bothered to use call , bind or apply , or just flat out return a regular inline object.

Under the hood there are a few difference between IIFEs and constructor-functions when both are used in their anticipated ways... ...but in this instance, there really isn't anything inherently different about the final return value done either way, from a high-level (ie: as far as your program should be concerned).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM