Первый вариант, однозначно - правильный. Только я бы сделал не
IIFE, а через промежуточную функцию:
var getAdder = function () { var res = 0; return function(x) { res += x; return res; } };
var sum = getAdder();
sum(1); // 1
sum(3); // 4
var sum2 = getAdder(); // два независимых сумматора
sum2(1); //1
sum2(3); // 4
А насчет второго варианта: зачем использовать такой синтаксис ? Крайне неудобно на мой взгляд.
А главное, вы замыкаете функцию на внешнюю переменную - это не очень хорошо. Поясню:
var adder2 = new Function('x', 'var result = adder.last? adder.last + x : x; adder.last = result; return result');
adder2(2); //ReferenceError: adder is not defined
Поэтому, от второго решения я бы отказался.