为什么我不能访问这个JS对象';ClojureScript中的道具?
我正在调试一些代码,并将问题归结为以下一个简单示例:为什么我不能访问这个JS对象';ClojureScript中的道具?,clojure,clojurescript,Clojure,Clojurescript,我正在调试一些代码,并将问题归结为以下一个简单示例: (js/console.log (.-hey (clj->js {:hey "please work!"}))) 打印未定义的 它一定与高级优化期间的重命名有关,但我不知道发生了什么,也不知道如何修复它 如果您使用在线CLJS REPL,例如,它可以正常工作(返回nil但打印请工作!),但是在使用cljsbuild的高级优化下,它根本不工作 知道我在哪里搞砸了吗 编辑: 经过进一步思考,以及clojurians对slack的一些建议,
(js/console.log (.-hey (clj->js {:hey "please work!"})))
打印未定义的
它一定与高级优化期间的重命名有关,但我不知道发生了什么,也不知道如何修复它
如果您使用在线CLJS REPL,例如,它可以正常工作(返回nil
但打印请工作!
),但是在使用cljsbuild
的高级优化下,它根本不工作
知道我在哪里搞砸了吗
编辑:
经过进一步思考,以及clojurians对slack的一些建议,我认为这是因为当我使用clj->js
时,优化会破坏关键字
我发现我(认为)我需要这样做,因为我正在尝试与D3.js库(从cljsjs)进行互操作,当我传递东西时,它期望的是js
对象,而不是cljs
对象。是否有一种惯用的方式将cljs对象传递给正在交互的js库?(如果这确实是我的问题?使用高级优化编译时,您的代码将无法工作。您可以通过比较使用不同优化设置编译的版本来检查它
产生JS对象的部件工作正常,例如,以下部件将正常工作:
(.log js/console (clj->js {:hey "please work"}))
将产生
Object {hey: "please work"}
但是访问hey
属性的部分将在编译过程中使用高级优化中断
编译时
(.log js/console (.-hey (clj->js {:hey "please work"})))
你会得到类似的结果:
使用优化:无
:
console.log(
cljs.core.clj__GT_js.call(
null,new cljs.core.PersistentArrayMap(null, 1,
[new cljs.core.Keyword(null,"hey","hey",301812684),"please work"], null)
).hey);
使用优化:高级:
console.log(Tg(new jb(null,1,[Nh,"please work"],null)).ci);
注意.hey
属性键是如何被损坏到.ci
中的。这是因为googleclosure在优化阶段对其进行了重命名(为了节省结果JS文件中的空间,它将名称替换为较短的标识符)<代码>“嘿”
对象中的字符串不会被损坏,因为它是一个字符串文本,您会得到不一致性
当您将clj->js
的结果传递给外部函数(例如在d3js中)时,您的代码应能按预期工作,因为如果您使用带有externs文件的精简版本,外部库不会损坏(请参阅@Andre对您的问题和问题的评论)
当您需要访问这些属性(如示例中所示)并需要它与您可以使用的高级优化一起工作时,或如中所述。Hmmm您是否尝试过(aget(clj->js…“嘿”)或#js{“嘿”…?检查D3的外部程序。@Timothyprattley我认为这会起作用,但我最终将映射更改为向量/数组,因为索引不会损坏,我使用aget
作为向量的索引。这也很有效,感谢您的响应!思考得好!很高兴您解决了它。很棒的建议。另外,这里还有另一个解决方案(类似)我最终使用了:我最终将映射更改为向量/数组,因为索引不会被破坏,我正在使用aget
作为向量的索引。这也很有效,感谢您的响应!我想补充一点,正确的闭包编译器处理方法是goog.object/get
或goog.object/getValueByKeys
,和aget
,除非直接使用数组。