我需要将属性访问器传递给函数,例如:
(defn test [access]
(.log js/console (str (access js/window))))
(test #(.-screenLeft %))
这是最好的方法吗?以下不起作用:
(test .-screenLeft)
我需要将属性访问器传递给函数,例如:
(defn test [access]
(.log js/console (str (access js/window))))
(test #(.-screenLeft %))
这是最好的方法吗?以下不起作用:
(test .-screenLeft)
一般来说,您的方法是在 Clojure 中执行此操作的规范方法。
在 ClojureScript 中,这通常也是最好的方法;主要问题是在 JavaScript 和 ClojureScript 中引入属性有两种方法:
索引样式 -- a["foo"]
/ (aget a "foo")
;
点属性样式 -- a.foo
/ (.-foo a)
.
如果您希望代码在高级模式下编译,您需要确保没有将它们混合用于相同的属性。(混合使用一种模式引入属性,然后使用另一种模式进行访问。)这是因为 Google Closure 编译器可以随意重命名以点属性样式引入的属性,而将那些以索引样式引入的属性不理会。
注意。这不适用于 JavaScript 环境(js/alert
等)提供的显式导出的属性和符号。
我认为您的解决方案很好,但您可能更喜欢这样的东西:
(defn test [access]
(->> access name (aget js/window) str (.log js/console)))
通过利用name
,您现在可以通过以下screenLeft
任何方式访问该属性:
(test :screenLeft)
(test 'screenLeft)
(test "screenLeft")