2016-04-06 18 views
5

tôi đã sử dụng các ví dụ sau đây để kiểm tra đệ quy gọi đuôi với Babel và es2016 cài sẵn:hiện Babel có cài đặt trước `es2016` có triển khai tối ưu hóa cuộc gọi đuôi không?

'use strict'; 

try { 
    function r(n) { 
     if (n%5000===0) 
      console.log(`reached a depth of ${n}`); 
     r(n+1); 
    } 
    r(0); 
} catch (e) { 
    if (!(e instanceof RangeError)) 
     throw e; 
    else 
     console.log('stack blown'); 
} 

tập tin package.json của tôi là:

{ 
    "name": "tail-call-optimization", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
     "build": "babel es6 --out-dir es5 --source-maps", 
     "watch": "babel es6 --out-dir es5 --source-maps --watch", 
     "start": "node es5/app.js" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
     "babel-cli": "^6.6.5", 
     "babel-core": "^6.7.4", 
     "babel-loader": "^6.2.4", 
     "babel-polyfill": "^6.7.4", 
     "babel-preset-es2016": "^6.0.10", 
     "babel-runtime": "^6.6.1" 
    }, 
    "dependencies": { 
     "babel-polyfill": "^6.7.4", 
     "source-map-support": "^0.4.0" 
    } 
} 

... và .babelrc chỉ đơn giản là:

{ 
    "presets": ["es2016"] 
} 

Chạy trên bằng:

npm run build && npm run start 

... kết quả ở đầu ra giao diện điều khiển sau:

reached a depth of 0 
reached a depth of 5000 
reached a depth of 10000 
reached a depth of 15000 
stack blown 

Thật vậy, nhìn vào các tập tin trong thư mục transpiled es5, không có gì để gợi ý rằng TCO đã được thực hiện là.

Tôi có thiếu gì đó không?

Phiên bản nút của tôi là 4.3.2.

Trả lời

0

Không có plugin "chính thức" Babel 6/cài đặt trước nào hiện đang triển khai TCO. babel-preset-es2016 không phải là giá trị đặt trước "chính thức". Trừ khi TCO dựa vào sự hỗ trợ của trình phân tích cú pháp trong Babylon (tôi không nghĩ như vậy, nhưng tôi không chắc) thì tôi cho rằng một plugin/cài đặt sẵn của userland có thể thực hiện nó, và có lẽ (nhưng không phải là tôi biết của). Đây là vấn đề theo dõi việc thực hiện lại "chính thức" cuối cùng: T2614. Nếu ai đó muốn PR liên kết với tài liệu Học tập ES2015 @Marcus đã đề cập đến ping tôi ở đây và tôi sẽ hợp nhất nó.

5

Nhìn vào: https://babeljs.io/docs/learn-es2015/ một lần đọc:

Tạm thời Removed trong Babel 6

Chỉ rõ ràng tự tham khảo đuôi đệ quy đã được hỗ trợ do sự phức tạp và hiệu quả tác động của việc hỗ trợ đuôi gọi trên toàn cầu. Đã bị xóa do các lỗi khác và sẽ được triển khai lại.

Vì vậy, tôi đoán nó hiện không được triển khai.

Các vấn đề liên quan