0
dynobj = {};
methods = ["method1","method2", "method3"];
for (var i = 0; i < methods.length; i++) {
    dynobj[methods[i]] = function () {
      alert("I am " + i);
    };
};
dynobj.method2();
dynobj.method1();

I expect "I am 1" and "I am 0", but have "I am 3" and "I am 3". What the correct way to have behaveary which I expect?

Gulaev Valentin
  • 575
  • 1
  • 7
  • 19

1 Answers1

4

Try the following:

var dynobj = {};

var methods = ["method1", "method2", "method3"];

var length = methods.length;

for (var i = 0; i < length; i++) {
    dynobj[methods[i]] = (function (i) {
        return function () {
            alert("I am " + i);
        };
    }(i));
}

dynobj.method2();
dynobj.method1();

See the demo: http://jsfiddle.net/3Fxv5/

Aadit M Shah
  • 72,912
  • 30
  • 168
  • 299