(defn domready [handler]
(.addEventListener js/window "DOMContentLoaded" handler))
我从here借用了这段代码。问题是我不完全理解发生了什么。 JS interop对我来说仍然有点神秘。
.addEventListener
所以这显然是一个过程调用,但它是通用的。这就像Clojurescript把对象里面的所有内容拿走了,把它取出来,你用它在“对象”上调用该方法。只要该“对象”具有“.addEventListener”属性,它就会调用它。这是它在做什么?为什么不使用关键字呢?比如(:addEventListener domElement)
,对我来说似乎更合乎逻辑。
js/window
"DOMContentLoaded"
一个熟悉的字符串。
handler
也很熟悉,但它有this
的概念吗?不是说我真的会想念this
。
答案 0 :(得分:5)
.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中访问其他命名空间中的变量的方式没有什么不同。如果您在(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) }
我希望这会有所帮助,如果您想要实时尝试并学习更多内容,可以访问Talking with JS教程中的Diving into ClojureScript,或者查看section of the lt-cljs-tutorial。
答案 1 :(得分:2)
.addEventListener
是对全局Javascript对象js/window
的方法调用。此方法调用有两个参数:"DOMContentLoaded"
和handler
。
当您进行互操作(Java或Javascript)时,您实际上是在对象上调用方法。这里发生的事情背后有宏。在(
是一个动词后,我通常将其视为函数调用(尽管它也可能是宏或特殊形式)。在进行互操作时,动词是实例之后,以及之后的参数。
如果它是直接的Javascript,它看起来像这样:
function domready(handler){
window.addEventListener("DOMContentLoaded" handler);
}
答案 2 :(得分:1)
我只是在学习clojurescript,所以我真的不知道这是不是正确的答案,但我已经按照以下方式完成:
(defn handler [] (js/console.log "ready"))
(js/document.addEventListener "DOMContentLoaded" handler)
然后翻译为
cljs.user.handler = (function cljs$user$handler(){
return console.log("ready");
});
document.addEventListener("DOMContentLoaded",cljs.user.handler);
检查clojurescript如何翻译我使用KLIMPSE http://app.klipse.tech/
的代码