我需要将属性访问器传递给函数,例如:
(defn test [access]
(.log js/console (str (access js/window))))
(test #(.-screenLeft %))
这是最好的方法吗?以下不起作用:
(test .-screenLeft)
答案 0 :(得分:4)
一般来说,你的是在Clojure中这样做的规范方法。
在ClojureScript中,这通常也是最好的方法;主要的问题是有两种方法可以在JavaScript和ClojureScript中引入属性:
索引样式 - a["foo"]
/ (aget a "foo")
;
点缀属性样式 - a.foo
/ (.-foo a)
。
如果您希望代码在高级模式下编译,则需要确保不要将它们混合到同一属性中。 (在将属性引入一个模式的意义上混合,然后使用另一个模式进行访问。)这是因为Google Closure编译器可以自由地重命名使用点状属性样式引入的属性,而使用它独立留下的索引样式引入的属性。
NB。这不适用于JavaScript环境(js/alert
等)提供的显式导出的属性和符号。
答案 1 :(得分:2)
我认为你的解决方案很好,但你可能会喜欢这样的东西:
(defn test [access]
(->> access name (aget js/window) str (.log js/console)))
利用name
,您现在可以通过以下任何方式访问媒体资源screenLeft
:
(test :screenLeft)
(test 'screenLeft)
(test "screenLeft")