.addEventListener
这显然是一个过程调用,但它有点通用。就像Clojurescript将对象中的所有内容都取出来一样,并使用它来调用“对象”上的该方法。只要该“对象”具有“.addEventListener”属性,它就会调用此方法。这是它在做什么吗?为什么不使用关键字呢?例如(:addEventListener domElement),我觉得这更合理。
您对其工作方式的心理模型大多正确。编译时,它将要运行的函数名称移动到第一个参数上作为方法。
(.method obj ...args)
被转换为 obj.method(...args)
这种互操作性来自父语言Clojure。
关于为什么我们有一个明确的调用函数版本而不是Clojure惯用语,我认为这个想法是要在本地Clojure代码和Clojure语义(不可变性,友好的CLJ数据结构等)与与主机环境进行交互的代码之间保持清晰的分离(可变性,不友好的CLJ数据结构等)。
在我看来,鉴于CLJS和主机平台的语义差异如此之大,最好在这两者之间有明确的分离。对我来说,在这种情况下,明确比隐含更好(很容易在代码中看到什么是CLJS中的JS代码以及什么是纯粹的CLJS)。
js/window
这是什么?它是一个命名空间还是一个对象?它们是一样的吗?
两者都是,js/
正在访问命名空间js
,这是CLJS放置JS命名空间的位置(因为只有一个和全局的)。 window
只是从js命名空间中获取window
变量。
这与您在CLJS中访问其他命名空间中的变量的方式没有区别。如果您在(ns cljs.test)
中(def a 1)
,然后运行cljs.test/a
,那么这将给您1
。同样的形式,ns / something-in-that-ns
。
"DOMContentLoaded"
一个熟悉的字符串。
\o/
handler
也很熟悉,但它是否具有this的概念?我不会真正错过这个。
不确定this
与handler
有什么关系。它只是作为参数传递给domready
的高阶函数,就像您在JS中所做的那样:function domready (onReady) { window.addEventListener("DOMContentLoaded", onReady) }
希望这能帮到你,如果你想亲身尝试并学习更多,可以访问Diving into ClojureScript教程中的Talking with JS部分,或者查看这个lt-cljs-tutorial的章节。
this-as
宏来处理this
。 - Michiel Borkent