javascript - Anonymous function as callback -
this question has answer here:
i seeking understanding why way using anonymous functions erroring in circumstances.
in snippet below popuplate 2 arrays functions invoked @ later stage.
var arr1 = []; var arr2 = []; // callback function var func = function(i){ return function(){$("body").append(i);} }; var = 1; while(i <= 5) { arr1.push(function(){$("body").append(i);}); arr2.push(func(i)); i++; } // invoke functions $("body").append("output arr1 == "); for(var c = 0; c < arr1.length; c++){ arr1[c](); } $("body").append("<br> output arr2 == "); for(var c = 0; c < arr1.length; c++){ arr2[c](); }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
now, think understand why arr1
outputs 66666
, because @ time of invocation, i == 6
, becuase has not been stored param within function @ time of creation, i
retains it's last known value?
what really don't understand why recieve typeerror: arr2[c] not function
when change callback function to:
var func = function(i){ $("body").append(i); };
why happen , appropriate / elegant way achieve functionality.
for first part of question, right, retain latest known value. avoid that, need use closure. example:
(function(x) { arr2.push(func(x)); })(i);
closure can used "scope hack". in case, ensure injected value constant current value of i
.
for second part of question, confusion caused fact insert result of function (i.e.: func(i)
) instead of function (func
).
in first scenario, return explicit function(){...}
array contain function can call operator "()".
in second scenario, in return $(<...>).append()
, it's not guaranteed anymore return value function. in case, result "jquery" (see: jquery append) , not function, hence error correct. cannot use value function.
one way out is:
arr2.push(func);
then:
arr2[c](c);
or this:
(function(x){ arr2[x](x); })(c);
if needed, can helpful console.log
populated inside arrays before assuming right. since javascript not typed language, may go little while before suspecting wrong seem work intended.
hope helps!
Comments
Post a Comment