Функция будет выполняться в обоих случаях, единственная реальная разница в том, каким может быть возвращаемое значение выражения и какое значение "this" будет внутри функции.
В основном поведение
new expression
Эффективно эквивалентно
var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
result = tempObject;
Хотя, конечно, tempObject и result являются временными значениями, которые вы никогда не увидите (это подробности реализации в интерпретаторе), и не существует механизма JS для проверки "не является объектом".
Вообще говоря, метод "new function () {..}" будет медленнее из-за необходимости создания объекта this для конструктора.
Тем не менее, это не должно быть реальной разницей, поскольку распределение объектов не является медленным, и вы не должны использовать такой код в горячем коде (из-за затрат на создание объекта функции и связанного закрытия).
Редактировать: одна вещь, которую я понял, что я упустил из этого, это то, что tempObject
получит прототип expression
s, например. (до expression.call
) tempObject.__proto__ = expression.prototype