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?