{{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?}} 执行的检查之外的任何东西。
可能有一天值得清理。