2

我需要将属性访问器传递给函数,例如:

(defn test [access]
  (.log js/console (str (access js/window))))

(test #(.-screenLeft %))

这是最好的方法吗?以下不起作用:

(test .-screenLeft)
4

2 回答 2

4

一般来说,您的方法是在 Clojure 中执行此操作的规范方法。

在 ClojureScript 中,这通常也是最好的方法;主要问题是在 JavaScript 和 ClojureScript 中引入属性有两种方法:

  • 索引样式 -- a["foo"]/ (aget a "foo");

  • 点属性样式 -- a.foo/ (.-foo a).

如果您希望代码在高级模式下编译,您需要确保没有将它们混合用于相同的属性。(混合使用一种模式引入属性,然后使用另一种模式进行访问。)这是因为 Google Closure 编译器可以随意重命名以点属性样式引入的属性,而将那些以索引样式引入的属性不理会。

注意。这不适用于 JavaScript 环境(js/alert等)提供的显式导出的属性和符号。

于 2013-07-11T20:59:20.873 回答
2

我认为您的解决方案很好,但您可能更喜欢这样的东西:

(defn test [access]
  (->> access name (aget js/window) str (.log js/console)))

通过利用name,您现在可以通过以下screenLeft任何方式访问该属性:

(test :screenLeft) 
(test 'screenLeft)
(test "screenLeft")
于 2013-07-11T19:45:39.883 回答