new Function
создает функцию, которую можно использовать повторно.eval
просто выполняет заданную строку и возвращает результат последнего оператора.Ваш вопрос введен в заблуждение, когда вы пытались создать функцию-оболочку, которая использует функцию для эмуляции eval.
Правда ли, что они разделяют некоторый код за кулисами?Да, очень вероятно.Точно такой же код?Нет, конечно.
Для забавы, вот моя собственная несовершенная реализация, использующая eval для создания функции.Надеюсь, это проливает некоторый свет на разницу!
function makeFunction() {
var params = [];
for (var i = 0; i < arguments.length - 1; i++) {
params.push(arguments[i]);
}
var code = arguments[arguments.length - 1];
// Creates the anonymous function to be returned
// The following line doesn't work in IE
// return eval('(function (' + params.join(',')+ '){' + code + '})');
// This does though
return eval('[function (' + params.join(',')+ '){' + code + '}][0]');
}
Самое большое различие между этой и новой функцией заключается в том, что функция не имеет лексической области действия.Так что у него не будет доступа к переменным замыкания, а у меня будет.