Đó là một chức năng Máy phát điện .
Máy phát điện là các chức năng có thể được thoát ra và sau đó được nhập lại. Bối cảnh của họ (ràng buộc biến) sẽ được lưu trên các lối vào lại.
Gọi một hàm tạo không thực hiện ngay phần thân của nó; thay vào đó, một đối tượng lặp cho hàm được trả về. Khi next()
phương thức của trình lặp được gọi, phần thân của hàm trình tạo được thực thi cho đến khi yield
biểu thức đầu tiên , xác định giá trị được trả về từ trình vòng lặp hoặc, với yield*
, ủy nhiệm cho một hàm trình tạo khác.
Ghi chú lịch sử:
Đó là một cú pháp được đề xuất cho EcmaScript.next
.
Dave Herman của Mozilla đã nói về EcmaScript.next . Lúc 30:15 , ông nói về máy phát điện.
Trước đó, ông giải thích cách Mozilla thực hiện thử nghiệm các thay đổi ngôn ngữ được đề xuất để giúp chỉ đạo ủy ban. Dave hợp tác chặt chẽ với Brendan Eich, CTO của Mozilla (tôi nghĩ) và nhà thiết kế JavaScript gốc.
Bạn có thể tìm thêm chi tiết trên wiki nhóm làm việc EcmaScript: http://wiki.ecmascript.org/doku.php?id=harmony:generators
Nhóm làm việc (TC-39) có thỏa thuận chung rằng EcmaScript.next nên có một số loại đề xuất trình lặp, nhưng đây không phải là cuối cùng.
Bạn không nên dựa vào điều này hiển thị mà không thay đổi trong phiên bản tiếp theo của ngôn ngữ và ngay cả khi nó không thay đổi, có thể nó sẽ không hiển thị rộng rãi trong các trình duyệt khác trong một thời gian.
Tổng quat
Các coroutines hạng nhất, được biểu diễn dưới dạng các đối tượng đóng gói các bối cảnh thực thi bị treo (tức là kích hoạt chức năng). Nghệ thuật ưu tiên: Python, Icon, Lua, Scheme, Smalltalk.
Ví dụ
Chuỗi số vô hạn của các số Fibonacci (các hành vi bất chấp khoảng 2 53 ):
function* fibonacci() {
let [prev, curr] = [0, 1];
for (;;) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
Máy phát điện có thể được lặp đi lặp lại trong các vòng lặp:
for (n of fibonacci()) {
// truncate the sequence at 1000
if (n > 1000)
break;
print(n);
}
Máy phát điện là các vòng lặp:
let seq = fibonacci();
print(seq.next()); // 1
print(seq.next()); // 2
print(seq.next()); // 3
print(seq.next()); // 5
print(seq.next()); // 8
function*
cú pháp được hỗ trợ trong Firefox kể từ v26: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ trộm *. Các phiên bản cũ hơn đã sử dụng một cú pháp khác nhau.