Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我不能访问这个JS对象';ClojureScript中的道具?_Clojure_Clojurescript - Fatal编程技术网

为什么我不能访问这个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
,除非直接使用数组。