eval строки 'a.hide()' выполнится в глобальном контексте, а там объекта "a" нет.
(function () {
var obj = {
test: function () {
alert(1);
}
};
eval("obj.test()");
}());
function func(str) {
eval(str);
}
(function () {
var obj = {
test: function () {
alert(1);
}
};
func("obj.test()"); // func вместо setTimeout
}());