new Function
tworzy funkcję, której można użyć ponownie. eval
po prostu wykonuje podany ciąg i zwraca wynik ostatniej instrukcji. Twoje pytanie jest błędne, gdy próbowałeś utworzyć funkcję opakowującą, która używa funkcji do emulacji wartości eval.
Czy to prawda, że za zasłonami mają wspólny kod? Tak, bardzo prawdopodobne. Dokładnie ten sam kod? Nie, na pewno.
Dla zabawy, oto moja własna niedoskonała implementacja wykorzystująca eval do tworzenia funkcji. Mam nadzieję, że rzuca trochę światła na różnicę!
function makeFunction() {
var params = [];
for (var i = 0; i < arguments.length - 1; i++) {
params.push(arguments[i]);
}
var code = arguments[arguments.length - 1];
return eval('[function (' + params.join(',')+ '){' + code + '}][0]');
}
Największą różnicą między tą a nową funkcją jest to, że funkcja nie ma zakresu leksykalnego. Więc nie miałby dostępu do zmiennych zamykających, a mój miałby.