.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
只是window
从js名称空间获取变量。
这与在CLJS中访问其他命名空间中的变量的方式没有什么不同。如果你(def a 1)
进去(ns cljs.test)
再跑cljs.test/a
,那会给你的1
。相同的形式,ns/something-in-that-ns
。
"DOMContentLoaded"
一个字符串,很熟悉。
\ o /
handler
也很熟悉,但是有这个概念吗?不是说我真的会想念这个。
不确定this
与handler
。domready
就像在JS中一样,它只是作为参数传递的高阶函数:function domready (onReady) { window.addEventListener("DOMContentLoaded", onReady) }
我希望这可以帮助,如果你想尝试一下现场,了解更多一些,也许访问与JS说话就潜入ClojureScript教程,也许这个检查的LT-cljs教程的部分。