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 将所有命名空间折叠成一个平展的 var 结构,所以这些在其他任何地方都不会用于除了 {{cljs.core/exists?}} 执行的检查之外的任何东西。

可能有一天值得清理。

1 答案

0 投票
参考:https://clojure.atlassian.net/browse/CLJS-3055 (由 thheller 报告)
...