Eval используется, когда вам нужно «сгенерировать» и выполнить код. И под генерацией я подразумеваю включение из внешнего источника (файл, веб-сайт, «агент»), а также создание на лету внутри программы.
И причина, по которой вы хотели бы генерировать код, помимо очевидных примеров внешних модулей и сайтов оценки, обычно заключается в том, чтобы динамически ссылаться на имена объектов и свойств в коде.
Первый пример, кстати, уже происходит, когда HTML-страница загружена и имеет тег сценария или атрибуты обработчика событий тегов HTML - поэтому с самого начала веб-разработчик использует EVAL, даже если это браузер звонит.
Что косвенно подводит меня к этой второй причине - доступу к именам объектов. В некоторых языках, таких как java, способность к самоанализу уменьшает или устраняет необходимость использовать eval для java. Оказывается, поскольку объекты в Javascript являются полностью динамическими, доступ к свойствам в Javascript сравним с интроспекцией в других языках, где вы можете обращаться к именам, созданным на лету, и ссылаться на них. Кроме того, Javascript имеет функции 'call' и 'apply' для динамического вызова функций с их параметрами.
Наконец, что касается выполнения кода, можно использовать eval для повышения производительности - вместо многоуровневого условного доступа или доступа к свойству, который определяет, какой код запускать или какой объект использовать, можно создать минимальный фрагмент кода, который может иметь чтобы быть выполненным сотни тысяч раз, вывести его в функцию, а затем просто вызвать эту функцию. Это может работать с мультиметодами, например, после определения конкретных используемых аргументов. Впрочем, это разумная причина, поскольку javascript рассматривает функции как объекты первого класса.