मैं जावास्क्रिप्ट में वास्तव में क्या नफरत करता हूं (यदि आप इसे एफपी भाषा के रूप में देखने की कोशिश करते हैं) यह है:
function getTenFunctionsBad() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push(function () {
return i;
});
}
return result;
}
function getTenFunctions() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push((function (i) {
return function () {
return i;
}
})(i));
}
return result;
}
var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
// using rhino print
print(functionsBad[i]() + ', ' + functions[i]());
}
// Output:
// 10, 0
// 10, 1
// 10, 2
// 10, 3
// 10, 4
// 10, 5
// 10, 6
// 10, 7
// 10, 8
// 10, 9
आपको इस तरह के व्यवहार को समझने के लिए JS स्टैक एनवायरनमेंट (मुझे नहीं लगता कि यह सही टर्म है) को समझने की जरूरत है।
उदाहरण के लिए स्कीम में आप ऐसी चीज़ का उत्पादन नहीं कर सकते हैं (ठीक है, ठीक है - अंतर्निहित भाषाओं के संदर्भों की मदद से आप इसे बना सकते हैं):
(define (make-ten-functions)
(define (iter i)
(cond ((> i 9) '())
(else (cons (lambda () i) (iter (+ i 1))))))
(iter 0))
(for-each (lambda (f)
(display (f))
(newline)) (make-ten-functions))