Общее то, что они работают со строками, т.е. компилируют строки в JS. Function всегда создаёт глобальные функции, т.е.
var a = 1;
(function () {
var a = 2;
new Function('alert(a)')(); // 1
})();
A eval работает в том контексте, в котором он был вызван.
var a = 1;
(function () {
var a = 2;
eval('alert(a)'); // 2
})();
В 99% случаев лучше использовать Function, т.к. для такого кода также используется JIT компилятор VM, а вот для eval конструкций нет и это может серьёзно сказаться на производительности, а самое страшное то, что вызов eval внутри блока также отменяет использование JIT для всего блока:
// Очень быстрый цикл, т.к. используется JIT
for (var i = 0; i < 1e6; i++) {
console.log(el);
}
// Всё будет очень тормозить, т.к. вызов eval внутри цикла отменил использование JIT для всей конструкции.
for (var i = 0; i < 1e6; i++) {
eval('console.log(el);');
}