Question

I'm not sure exactly how to describe what I want. I want to define a function with the parameters being a local VALUE not a reference.

say I have list of objects I want to create

for(i = 0; i < 10; i++){
  var div = document.createElement("div");
  div.onclick = function(){alert(i);};
  document.appendChild(div);
}

Now I believe in this example no matter what div I click on, it would alert "10"; as that is the last value of the variable i;

Is there a way/how do I create a function with the parameters being the value they are at the time I specify the function... if that makes any sense.

Was it helpful?

Solution

You need to create the function inside another function.

For example:

div.onclick = (function(innerI) {
    return function() { alert(innerI); }
})(i);

This code creates a function that takes a parameter and returns a function that uses the parameter. Since the parameter to the outer function is passed by value, it solves your problem.

It is usually clearer to make the outer function a separate, named function, like this:

function buildClickHandler(i) {
    return function() { alert(i); };
}

for(i = 0; i < 10; i++){
    var div = document.createElement("div");
    div.onclick = buildClickHandler(i);
    document.appendChild(div);
}

OTHER TIPS

You could use an anonymous function:

for(i = 0; i < 10; i++){
    (function(i){
        var div = document.createElement("div");
        div.onclick = function(){alert(i);};
        document.appendChild(div);
    })(i)
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top