สิ่งที่ฉันเกลียดมากในจาวาสคริปต์ (ถ้าคุณพยายามมองว่ามันเป็นภาษา FP) คือ:
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) {
print(functionsBad[i]() + ', ' + functions[i]());
}
คุณต้องเข้าใจสภาพแวดล้อม JS stack (ฉันไม่รู้ว่ามันเป็นคำที่เหมาะสมหรือไม่) เพื่อทำความเข้าใจพฤติกรรมดังกล่าว
ในรูปแบบเช่นคุณไม่สามารถสร้างสิ่งนั้นได้ (โอเคตกลง - ด้วยความช่วยเหลือของการอ้างอิงภาษาพื้นฐานคุณสามารถสร้างได้):
(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))