Điều tôi thực sự ghét trong javascript (nếu bạn cố gắng xem nó như ngôn ngữ FP) là:
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
Bạn cần hiểu môi trường ngăn xếp JS (tôi không biết nếu đó là thuật ngữ đúng) để hiểu hành vi như vậy.
Ví dụ, trong sơ đồ Bạn không thể tạo ra những thứ như vậy (Ok, ok - với sự trợ giúp của các tài liệu tham khảo của các ngôn ngữ cơ bản Bạn có thể thực hiện):
(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))