2024年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解更多关于如何使用此信息。

0
ClojureScript
{{cljs.core/exists?}} 宏将检查给定命名空间中的每个“段”,以避免属性访问错误。然而,这并不能很好地转换为 {{:advanced}} 优化,这会导致不必要的变量保留,而这些变量本应被删除。这非常常见的一个用法是 {{defonce}},如下所示


(defonce PROTOCOL_SENTINEL #js {})


展开为


if((typeof cljs !== 'undefined') && (typeof cljs.core !== 'undefined') && (typeof cljs.core.PROTOCOL_SENTINEL !== 'undefined')){
} else {
cljs.core.PROTOCOL_SENTINEL = ({});
}


优化后


// 与伪名称
var $cljs$$ = {}, $cljs$core$$ = {};
if ("undefined" === typeof $cljs$$ || "undefined" === typeof $cljs$core$$ || "undefined" === typeof $cljs$core$PROTOCOL_SENTINEL$$) {
  var $cljs$core$PROTOCOL_SENTINEL$$ = {};
}

// 没有伪名称
var E={},F={};if("undefined"===typeof E||"undefined"===typeof F||"undefined"===typeof G)var G={};


注意额外的 {{var $cljs$$ = {}, $cljs$core$$ = {};}}。由于 Closure 将所有命名空间折叠为平面变量结构,因此这些变量将仅用于 {{cljs.core/exists?}} 执行的检查。

或许有一天值得清理。

1 个答案

0
相关链接: https://clojure.atlassian.net/browse/CLJS-3055 (由 thheller 报告)
...