javascript - JavaScript 的闭包参数转换(babel、traceur 等)
问题描述
寻找消除闭包的(babel、traceur 等)转换(将封闭变量转换为显式参数)
例子:
function original(){
var sum = 0;
var add = 1;
var param = 2;
var inc = (p2) => { ++add; return add + p2; }
for(var i = 0; i < 5; i++){
sum += inc(param);
}
console.log(sum);
}
输出选项 1:
// ===== GENERATED BELOW
function inc_noclo(locals, p2) {
++locals.add; return locals.add + p2;
}
function rewritten1(){
var sum = 0;
var locals = {add: 1}
var param = 2;
var inc = inc_noclo.bind(null, locals);
for(var i = 0; i < 5; i++){
sum += inc(param);
}
console.log(sum);
}
输出选项 2:
function inc_noclo(locals, p2) {
++locals.add; return locals.add + p2;
}
function rewritten2(){
var sum = 0;
var locals = {add: 1}
var param = 2;
for(var i = 0; i < 5; i++){
sum += inc_noclo(locals, param);
}
console.log(sum);
}
不适合的已知实现:
- 没有变量被关闭的特殊情况:codemix/babel-plugin-closure-elimination
- 好一点:https ://github.com/flexport/reflective-bind
适合但不适合 JS:
- 在Roslyn有一个像这样的转换类,但它太依赖于 Roslyn 的细节
解决方案
推荐阅读
- apache-camel - direct-vm 路由中缺少 routeId
- ios - 在 SwiftUI 中使用包装的 UIKit 选项卡视图在按钮按下时切换选项卡
- adobe - 如何设置 Adobe 分析?
- c# - ARM 上用于 HoloLens 2 的 gRPC 支持
- ffmpeg - 无法在 buildozer 或 p4a 中构建 FFmpeg
- c# - Google Drive Auth2:如何修复错误 400:redirect_uri_mismatch
- python - 如何创建一个猜数字游戏(机器猜用户正在想的数字)
- python - 使用 pynput 键入冒号 (:)
- java - 从 txt 文件中读取矩阵
- sql-server - 如何在部分百分比的 SELECT 语句中避免 SELECT COUNT