El uso de un nuevo operador con la devolución de una función javascript devuelve un ámbito impar

Estoy tratando de entender por qué las nuevas ejecuciones se ejecutan contra la función en lugar del retorno de la función en el ejemploy =:

function returnFunction(){ return function blah(str){ this.x = str; return this;}}

y = new returnFunction()("blah")
// output: Window {x: "blah"; top: Window, window: Window, location: Location, ....}
x = new (returnFunction())("blah")
// output: blah {x: "blah"}

z = new function blah(){return this;}()
// output: blah {}

zz = new function(){return this;}() //note the missing function name
// output: Object {}

b = new function blib(str){this.x = str; return this}
// blib {x: undefined}
bb = new function blib(str){this.x = str; return this}("blah")
// blib {x: "blah"}
c = new function blib(){this.x = "blah"; return this}
// blib {x: "blah"}

Así que en el caso de ynuevo crea una copia de lareturnFunction entonces lo invoca

y = (new returnFunction())()

Y al invocar una función anónima no tenemosthis así que por defectoWindow.

En el caso dex, envolviéndolo en los parens (returnFunction Se invoca devolviendo unblah función) y luegoblah Es invocado por la nueva configuración del operador.this a un nuevo objeto.

Parece extraño que tenga que envolvernew (returnFunction()) Para que se ejecute en el orden correcto.

¿Podría alguien explicarme la ejecución subyacente?

Respuestas a la pregunta(2)

Su respuesta a la pregunta