Ambos casos se ejecute la función, la única diferencia real es lo que puede ser el valor de retorno de la expresión, y cuál es el valor de "esto" dentro de la función.
Básicamente comportamiento de
new expression
es efectivamente equivalente a
var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
result = tempObject;
Aunque por supuesto tempObject y el resultado son valores transitorios nunca se puede ver (son detalles de implementación en el intérprete), y no hay un mecanismo JS para hacer la verificación de "no es un objeto".
Hablando en términos generales, el método "new function() {..}" será más lento debido a la necesidad de crear este objeto para el constructor.
Dicho esto, esta no debería ser una verdadera diferencia ya que la asignación de objetos no es lenta, y no debería usar dicho código en código caliente (debido al costo de crear el objeto de función y el cierre asociado).
Edición: una cosa que me di cuenta de que me perdí de esto es que el tempObject
obtendrá el prototipo expression
, por ejemplo. (Antes de la expression.call
) tempObject.__proto__ = expression.prototype
-1 Esto se debe a omitir "var" antes de "a", lo que lo hace global y no está relacionado con la pregunta. – Tomas