Ah ... các dạng đệ quy chức năng .... [[[flashback to comp sci class]]]
Bạn có thể sử dụng hàm trợ giúp:
function X(f) { return f.apply(this, arguments); }
X(function(me, n) { return n<=1 ? n : n*me(me,n-1); }, 6);
(trả về 720; đây là chức năng thừa, ví dụ kinh điển của đệ quy)
Điều này có thể lần lượt được ẩn danh:
(function (f) { return f.apply(this, arguments); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
hoặc chuyên ngành chức năng của một đối số, để tránh apply
và arguments
:
(function (f,x) { return f(f,x); })(
function(me, n) { return n<=1 ? n : n*me(me,n-1); },
6);
(cả hai loại này cũng trả lại 720)
Bí quyết sử dụng chức năng trợ giúp này cho phép chức năng của bạn nhận được elf là đối số đầu tiên của nó, và do đó gọi chính nó.
Để thích ứng với ví dụ của bạn:
(function (f,x) { return f(f,x); })(
function(me, i) { console.log(i); if (i<5) me(me,i+1); },
0)
trong đó hoạt động như mong đợi trong Firebug (log 0,1,2,3,4,5 để an ủi)
** Điều tốt nhất cần làm là không có chức năng ẩn danh, mà thay vào đó là hàm được xác định bằng câu lệnh khai báo hàm. – Pointy